gpt4 book ai didi

javascript - Javascript 中哪些类型的 block 会创建闭包

转载 作者:行者123 更新时间:2023-11-28 11:34:37 25 4
gpt4 key购买 nike

在使用 Javascript 工作了这么长时间之后,我仍然在接受闭包方面遇到问题!

(function() {
var pages = ["one", "two", "three"];
for (var index in pages) {
var p = pages[index];
setTimeout(function() { console.log(p); }, 500);
}
})();

上面的代码片段不应该打印 onetwotwo 吗? AFAIK p 位于由 for block 创建的闭包内,并且对于每个 setTimeout 来选取它们应该保持不变!那么为什么它会打印三个呢?

最佳答案

JavaScript 具有函数作用域,而不是 block 作用域。因此,当您循环数组时(P.S.不要对数组使用for..in),您正在创建 3 个闭包。您创建的每个闭包都引用相同 p 变量。因此,当超时最终运行时,它们将全部打印“三”,因为它们都打印相同 p变量。

您需要为数组中的每个元素创建一个新范围。幸运的是,JavaScript 有一个专门用于此目的的内置函数,.forEach .

(function() {
var pages = ["one", "two", "three"];
pages.forEach(function(p){
setTimeout(function() { console.log(p); }, 500);
});
})();

当它运行时,它会为每个元素运行回调。运行该回调时,将为每个元素创建一个新范围,因此它可以正常工作。

关于javascript - Javascript 中哪些类型的 block 会创建闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26662225/

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