使用var全局声明变量i:
var arr = [{}, {}, {}];
for (var i = 0; i < arr.length; i++) {
arr[i].onclick = function () {
console.log(i);
}
}
arr[0].onclick();
arr[1].onclick();
arr[2].onclick();
输出结果为:
原因是:i是使用var声明的全局变量,在onclick事件执行时,全局变量i已经在循环执行完毕后累加到了3。
该问题可以使用函数的闭包机制(借助于函数作用域)解决:
var arr = [{}, {}, {}];
for (var i = 0; i < arr.length; i++) {
arr[i].onclick = (function (i) {
return function () {
console.log(i);
}
})(i);
}
arr[0].onclick();
arr[1].onclick();
arr[2].onclick();
输出结果为:
同样的我们可以使用let声明变量,将作用域控制在块内(其实利用的也是闭包机制):
var arr = [{}, {}, {}];
for (let i = 0; i < arr.length; i++) {
arr[i].onclick = function () {
console.log(i);
}
}
arr[0].onclick();
arr[1].onclick();
arr[2].onclick();
输出结果为: