请参阅代码,其中解释了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;
}

09-30 16:42
查看更多