gpt4 book ai didi

javascript函数闭包工作

转载 作者:行者123 更新时间:2023-11-29 16:13:24 24 4
gpt4 key购买 nike

我正在阅读一本 javascript 书,并在关闭时遇到了以下代码

function constFunc() {
var funcs = [];
for (var i = 0; i < 10; i++) {
funcs[i] = function () {
return i;
}
}
return funcs;
}
var f = constFunc();
f[5]();

输出不是 5。给出的解释是“嵌套函数不会制作范围的私有(private)副本”。如果有人可以解释上述声明,我将不胜感激。

最佳答案

当您调用 constFunc 时,循环运行并为 funcs 数组的每个元素分配一个函数。这些函数各自返回 i 的值,该值在循环的每次迭代中从 0 变化到 9

这意味着一旦 constFunc 完成执行 i 将具有 9 的值。当您调用数组中的函数之一时,它会返回 i 的值,正如我们刚刚看到的那样,它现在是 9i 的值不会在循环的每次迭代中捕获。

您可以通过循环中的闭包强制捕获它:

for (var i = 0; i < 10; i++) {
(function (i) {
funcs[i] = function () {
return i;
};
}(i));
}

在这种情况下,您实际上是在循环的每次迭代中创建一个与 i 具有相同值的新变量。你可以在行动中看到 here .

通过将 i 传递给一个函数,您最终会复制它的值。所以在第一次迭代中,i 的值为 0。我们将该值传递给新函数(参数 i 是与循环初始化程序中声明的 i 不同的变量),然后从数组函数返回该值。这样,每个数组函数都返回一个不同的 i,而不是每个返回相同的i

关于javascript函数闭包工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21598689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com