新手常遇到的問題:在 for 循環中為多個按鈕綁定 onclick,點擊時彈出的卻是循環結束後的 i 值(如 3),而非對應的 0、1、2。根因在於 var 變量作用域是函數級,回調函數引用的是同一個 i,當事件觸發時循環已結束。
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() { alert(i); }; // 全輸出 3
}
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = (function(index) {
return function() { alert(this.value + '|' + index); };
})(i);
}
for (let i = 0; i < btns.length; i++) {
btns[i].onclick = function() { alert(this.value + '|' + i); };
}
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function() { alert(this.value); };
}
理解閉包與變量作用域,是進階前端工程師的必修課。