我不确定如何更好地说出这个问题,但基本上我的问题是:
我有这样的代码(不完全是,这段代码非常简单,而且我的代码有点复杂):
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs[i] = function() { return i; };
}
所以我的想法是funcs
中的每个函数在调用时都会返回0到9之间的每个数字。但问题是每个人在调用时仍然指的是变量i
,所以他们都将返回9.我如何按预期工作(即所有n,funcs[n]() === n
)?如何让每个函数范围仅捕获i
的当前值,而不是更改的值?
答案 0 :(得分:3)
我可以这样做:
var funcs = [];
for (var i = 0; i < 10; i++) {
(function (i) {
funcs[i] = function () {
return i;
};
})(i);
}
alert(funcs[3]());
为每次迭代创建单独的激活框架
您也可以使用地图:
var numbers = [];
for (var i = 0; i < 10; i++) {
numbers.push(i);
}
var funcs = numbers.map(function (i) {
return function () { return i; };
});
alert(funcs[3]());
答案 1 :(得分:0)
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs[i] = makeFunction(i);
}
function makeFunction(i) {
return function() {
return i;
}
}
返回函数中的 i
绑定到i
中的局部变量makeFunction
,而不是主代码块中的i
。