gpt4 book ai didi

javascript - 在循环中根据标准在 IIFE 中调用 setTimeout()

转载 作者:行者123 更新时间:2023-11-30 20:37:45 30 4
gpt4 key购买 nike

IIFE函数背后的逻辑和循环中setTimeout()背后的逻辑是什么。有两个for:

for (var i = 0; i < 10; i++) {
// Standard
setTimeout(function() {
console.log("Standard" + i);
}, 1000 * i);
}

for (var j = 0; j < 10; j++) {
// IIFE
(function(j) {
setTimeout(function() {
console.log("IIFE " + j);
}, 1000 * j);
})(j);
}

现在,当我使用 node.js 运行时,我在 10 秒后得到了这个结果(每个 console.log() 每秒执行一次):

PowerShell

有人可以向我解释第一个函数调用和第二个函数调用之间的运行时逻辑差异吗?

特别是如果你能回答这些问题:

  • 为什么在 for 中每秒都执行日志? (1000 * i|j 被忽略)
  • 为什么 i 的值总是 10?

提前谢谢你。

[编辑]我不明白为什么在 for 中每秒都会触发 console.log() 但超时秒数 1000 * i|j 可能是一个可见的超时。

最佳答案

为什么log在both for中每秒执行一次? (忽略 1000 * i|j)

这是因为setTimeout() 是一个异步函数。所以执行不会在这一步被阻塞,而是用给定的持续时间参数启动一个时钟,然后继续执行。一旦持续时间过去,事件就会被触发,回调被添加到事件循环队列中,以便一个一个地执行。

为什么 i 的值总是 10?

这是因为closure的概念.当第一个“标准”超时时,此时 i 的值已经是 10(所有 setTimeout 都已注册)。而在 IIFE 的情况下,j 是函数中的形式参数,它在每次迭代后接收循环计数器变量值。而这个函数中包含的setTimeout就用到了这个j

关于javascript - 在循环中根据标准在 IIFE 中调用 setTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49625909/

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