為什么不能直接傳遞getStar(i)

阿西_0001
2014-07-17
2 回答
舉報(bào)
0/150
提交
取消
為什么不能直接傳遞getStar(i)
2014-07-17
舉報(bào)
2014-12-13
不明覺厲
2014-12-07
這涉及到j(luò)avascript中閉包,作用域,引用的概念。
// 這段代碼是錯誤的
// 每個星星節(jié)點(diǎn)的點(diǎn)擊事件
for(var i=0;i<5;i++){
? stars[i].onclick=function(){
? ? getStar(i);
? }
}
當(dāng)前作用域總是能夠訪問外部作用域中的變量。
onclick函數(shù)總是能夠訪問到 window.onload 函數(shù)作用域中的變量i,
但是onclick函數(shù)沒有復(fù)制這個變量,只是引用了。
onload函數(shù)執(zhí)行完后,其中的變量i沒有銷毀,因?yàn)閛nclick函數(shù)引用了,
但是這個時候循環(huán)已經(jīng)執(zhí)行完畢,i的值變成了5。
當(dāng)onclick函數(shù)觸發(fā)執(zhí)行時,獲取變量i的值時,自然取到的是5,而不是星星對應(yīng)的序號。
解決辦法:復(fù)制一份。
// 每個星星節(jié)點(diǎn)的點(diǎn)擊事件
for(var i=0;i<5;i++){
!function(index) {
stars[index].onclick=function(){
getStar(index);
}
}(i);
}
利用自執(zhí)行函數(shù),將i作為參數(shù)傳入,index成為i的拷貝。
再把index放入onclick函數(shù)中即可。
更多關(guān)于閉包和作用域的知識,可參考javascript秘密花園文檔:
http://www.jb51.net/onlineread/JavaScript-Garden-CN/#function.closures