【发布时间】:2024-01-02 04:05:01
【问题描述】:
我已经阅读了一些教程来了解 JavaScript 中的作用域和闭包,并遇到了下面的代码。
我理解输出为 5,5,5,5,5 的第一个块,因为该函数在 for 循环完成后执行。但是我不完全理解为什么第二个块起作用......我是否认为在每次迭代中都会调用一个新函数,所以内存中同时运行了 5 个函数?我想要一个简单易懂的解释 - 我是学习 JavaScript 的新手。
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log('index: ' + i);
}, 1000);
}
for (var i = 0; i < 5; i++) {
(function logIndex(index) {
setTimeout(function () {
console.log('index: ' + index);
}, 1000);
})(i)
}
【问题讨论】:
-
Javascript 是按值调用原语的。将第二个示例替换为
for (var i = { i: 0 }; i.i < 5; i.i++) {和console.log('index: ' + index.i);,您将再次遇到与第一个示例相同的问题。 -
我也刚刚在另一个教程中遇到过这段代码,我很困惑,因为它看起来与这里的第一个示例非常相似,只是它以 1 秒的间隔打印出 10,我不明白为什么。它与此相关,因此我将其添加为注释而不是单独的线程: for (var i = 0; i
-
请注意,虽然上面链接的问题与此不完全相同,但有多种迹象表明它可以解决大部分问题 - 例如。 “为什么 let 会起作用而 var 不起作用”,范围界定规则,进一步的例子和关于这个问题的大量材料。这两个代码 sn-ps 也经常出现在答案中并进行了解释。
-
@ASDFGerte 大部分问题不是为什么 let 可以工作而 var 不能工作,这是对所发表评论的回复。我相信你也可以说这里有很多关于任何问题的材料。
标签: javascript function scope closures scoping