请参阅代码,其中解释了1000多个单词。我不明白,为什么所有5个创建的函数总是返回5(最后一个迭代值)。我真的很感兴趣,出了什么问题或错过了什么。我记得我敢,道格拉斯·克罗克福德(Douglas Crockford)曾经谈论过这件事,但是我也没有找到那个资源。
function createFunctions(n) {
var arrayFunctions = [];
for (var i=0; i<n; i++) {
arrayFunctions.push(function() {
console.log(i);
});
}
return arrayFunctions;
}
var arrayFunctions = createFunctions(5);
arrayFunctions[2](); // returns 5 instead of 2
arrayFunctions[3](); // returns 5 instead of 3
arrayFunctions[4](); // returns 5 instead of 4
最佳答案
函数关闭变量,而不是变量的值。这意味着它们都引用循环中定义的i,并在每次迭代时更新。到createFunctions
返回时,循环已完成,并且i处于其最终值(5)。
function createFunctions(n) {
var arrayFunctions = [];
for (var i=0; i<n; i++) {
(function(j) {
arrayFunctions.push(function() {
console.log(j);
});
}(i));
}
return arrayFunctions;
}