先上失敗案例:我剛開始看這個代碼,是100%贊同它的寫法的,代碼邏輯完全正確。但事實證明,我的理解還是太渣了。這個案例也讓我更進一步理解了 什麼叫回調函數。 註意事項,失敗就在於回調函數的調用時機不能匹配!!因為focus input框時才會調用回調函數(focus是獲得焦點事件)。但此時的showContent ( item .content)語句中的item已經是item數組中的最後一個元素了。 所以無論你focus哪一個input框,都是顯示到最後一個元素的focus效果, 複製代碼運行便知。<!DOCTYPE html > < html > < head > < meta charset= "utf-8" > < meta http-equiv= "X-UA-Compatible" content= "IE=edge" > < title ></ title > < link rel= "stylesheet" href= "" > </ head > < body > < p id= "info" > 123</ p > < p > E-mail: < input type= "text" id= "email" name= "email" ></ p > < p > Name: < input type= "text" id= "name" name= "name" ></ p > < p > Age: < input type= "text" id= "age" name= "age" ></ p > < script > function showContent (content){ document .getElementById ('info' ).innerHTML = content; } function setContent (){ var infoArr = [ {'id' :'email' ,'content' :'your email address' }, {'id' :'name' ,'content' :'your name' }, {'id' :'age' ,'content' :'your age' } ]; for (var i = 0 ; i < infoArr .length ; i ++) { var item = infoArr [i ]; //function() 回調函數。觸發事件才執行,導致所有的 item.content 都是最後一項。 // 註冊事件的回調函數在迴圈中不會執行,所以才叫回調。而閉包可以解決這個問題,匹配當前的 item.content document .getElementById (item .id ).onfocus = function (){ showContent (item .content) } } } setContent (); // 迴圈中創建了三個閉包,他們使用了相同的詞法環境 item , item.content 是變化的變數 // 當 onfocus 執行時, item.content 才確定,此時迴圈已經結束,三個閉包共用的 item 已經指向數組最後一項。 </ script > </ body > </ html > 成功案例,解決辦法一,閉包 註意事項,js是弱類型語言,它定義變數都是用var。不想c語言那些,有int,double。。。 所以以下2種語法都是合法的,一種是簡單數據,一種是函數。 註:js大體上分函數、對象、簡單數據3種數據類型。 var m = function(){return 56;} var n =function(){ return function(){} }//閉包,返回函數 <!DOCTYPE html > < html > < head > < meta charset= "utf-8" > < meta http-equiv= "X-UA-Compatible" content= "IE=edge" > < title ></ title > < link rel= "stylesheet" href= "" > </ head > < body > < p id= "info" > 123</ p > < p > E-mail: < input type= "text" id= "email" name= "email" ></ p > < p > Name: < input type= "text" id= "name" name= "name" ></ p > < p > Age: < input type= "text" id= "age" name= "age" ></ p > < script > function showContent (content){ document .getElementById ('info' ).innerHTML = content; }; function callBack (content){ return function (){ showContent (content) } }; function setContent (){ var infoArr = [ {'id' :'email' ,'content' :'your email address' }, {'id' :'name' ,'content' :'your name' }, {'id' :'age' ,'content' :'your age' } ]; for (var i = 0 ; i < infoArr .length ; i ++) { var item = infoArr [i ]; document .getElementById (item .id ).onfocus = callBack ( item . content ) } } setContent (); // 迴圈中創建了三個閉包,他們使用了相同的詞法環境 item , item.content 是變化的變數 // 當 onfocus 執行時, item.content 才確定,此時迴圈已經結束,三個閉包共用的 item 已經指向數組最後一項。 </ script > </ body > </ html >