解释为什么这个闭包在迭代时返回值

Explanation of why this closure returns the value at the time of the iteration

本文关键字:迭代 返回值 闭包 为什么 解释      更新时间:2023-09-26

可能重复:
JavaScript闭包是如何工作的?

我知道人们对闭包的一个问题是,除非你这样做,否则它会返回给定变量的最后一个值:

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = (function (x) {
            return function () {
                return x;
            }
        })(i);
    }
    return a;
}
}

我需要解释的事情有点太多了。

在JavaScript中,变量的作用域始终是function(或全局对象(。所以,如果你做一些类似的事情

for (var i = 0; i < 3; i++) {
    a[i] = function (x) {
        return i;
    };
}

仅涉及一个CCD_ 2。在for循环结束后,无论调用a[i]函数中的哪一个,i的值都是2

为了解决这个问题,我们需要建立一个新的范围。通常这是通过调用匿名函数来完成的,比如:

a[i] = (function (x) { // (1)
    return function () { //  (2)
        return x;
    };
})(i);

现在,迭代时的i被映射到每次迭代的全新x,函数(1(确保它被"捕获",直到执行a[i](2(。