我试图编写类似的代码:
var funcs = [];
for (var i=0; i<5 ; ++i) {
funcs[i]=function() {
alert(i);
};
}
显然,调用funcs[0]
不会0
像预期的那样发出警报,仅仅是因为该变量i
被匿名函数捕获,并且调用任何一个funcs[0..4]
都会发出警报“4”(i
最后一次迭代后的值并由所有创建的函数共享)。
我想到的第一个解决方法是使用某种函数生成器:
var funcs = [];
for (var i=0; i<5 ; ++i) {
funcs[i]=(function(cap) {
return function() {alert(cap)};
})(i);
}
这可以解决问题,但看起来确实令人费解且难以阅读。有没有更好的方法来获得预期的行为而不使用函数包装器?