請(qǐng)大家看以下代碼:
var elements = document.getElementsByTagName('input');
var n = elements.length;
for (var i = 0; i < n; i++) {
elements[i].onclick = function() {
console.log("This is element #" + i); }; }
運(yùn)行以上代碼,如果頁(yè)面上有10個(gè)按鈕的話,點(diǎn)擊每一個(gè)按鈕都會(huì)彈出 “This is element #10”! 。這和我們?cè)阮A(yù)期的并不一樣。這是因?yàn)楫?dāng)點(diǎn)擊事件被觸發(fā)的時(shí)候,for循環(huán)早已執(zhí)行完畢,i的值也已經(jīng)從0變成了。
我們可以通過(guò)下面這段代碼來(lái)實(shí)現(xiàn)真正正確的效果:
var elements = document.getElementsByTagName('input');
var n = elements.length;
var makeHandler = function(num) { // outer function
return function() {
console.log("This is element #" + num); }; };
for (var i = 0; i < n; i++)
{ elements[i].onclick = makeHandler(i+1); }
在這個(gè)版本的代碼中, makeHandler 在每回循環(huán)的時(shí)候都會(huì)被立即執(zhí)行,把i+1傳遞給變量num。外面的函數(shù)返回里面的函數(shù),而點(diǎn)擊事件函數(shù)便被設(shè)置為里面的函數(shù)。這樣每個(gè)觸發(fā)函數(shù)就都能夠是用正確的i值了。
更多建議: