这样的一种方式遍历,为什么一直是最后一个i值,前面的i值为什么没有进去onclick事件中;
我知道可以用参数传递进去可以实现,我现在不懂的是,为什么这种不行,是哪里出了问题~
今天刚回答了一个类似的问题 你先看看吧啊
http://.com/q/1010000004322692
你代码中每一个.onclick的匿名函数都绑定到同一个i变量,而不是i的值
当这些匿名函数被执行时才会真的使用i的值, 这时i的值固定为li.length
如果你想这些匿名函数使用不同的值,就需要把它们绑定到不同的变量。典型写法就是IIFE。
这是典型问题了,不好理解。看一下我的示例代码:
(function () {
var cl = console.log;
//要求:用循环语句,创建5个函数,当调用这些函数时,第一个函数输出0,第二个输出1,以此类推
//这样写可以吗?
var funcs = [];
for (var i = 0; i < 5; i++) {
funcs[i] = function () {
cl(i);//执行这条语句时,所使用的i的值已经是5了
}
}
//此时i的值是5,看看:
cl('i的值是:' + i);
funcs.forEach(function (func) {
func();
});//5 5 5 5 5 不行
//这样写就行了:
funcs = [];
for (var i = 0; i < 5; i++) {
funcs[i] = (function (a) {
return function () {
cl(a);//由于内部函数使用到a,所以这个a的值会暂留在内存中
}
})(i);//外部函数在这里已经被执行,所以i的值会复制到a
}
funcs.forEach(function (func) {
func();
});//0 1 2 3 4
})();
闭包的问题。
可以传参数进去解决这个问题。