【问题标题】:Please explain the output in this setTimeOut() function? [duplicate]请解释这个 setTimeOut() 函数的输出? [复制]
【发布时间】:2021-06-21 22:56:55
【问题描述】:

我尝试运行这段代码的 sn-p,我尝试在 setTimeOut() 函数中调整 i 值,而 o/p i 得到的是 55 次,每次间隔为3 seconds,谁能解释一下这个sn-p?

for (var i = 0; i < 5; i++) {
  console.log(i);
  setTimeout(function() {
      /////Why is this console.log printing 5?
      console.log(i);
    },

    i * 3000);
  console.log("i:", i)
}

输出:

0
i: 0
1
i: 1
2
i: 2
3
i: 3
4
i: 4
5
5
5
5
5

【问题讨论】:

    标签: javascript for-loop asynchronous logic settimeout


    【解决方案1】:

    传递给setTimeout 的回调在间隔之后被添加到事件队列中。随着每次迭代的间隔增加 3 秒(i * 3000),5 秒的记录间隔为 3 秒。

    More about event queue.

    由于函数作用域变量声明var i=0,回调中的所有日志都是5。当循环完成并执行队列中的回调时,变量i 的值为5(当i 为5 时,条件i&lt;5 失败)。

    Scope of variables.

    【讨论】:

      【解决方案2】:

      因为在循环关闭后变量“i”的值增加了 1。 您的循环使用 i=4 运行,然后在到达 for 循环块的末尾后,它增加 1 并变为 5,增加条件后检查 5&lt;5 并退出循环。 javascript 编译器将使用var 关键字声明的变量存储在其全局存储中,因此循环结束时不会释放它保留的内存。您可以通过使用 let 关键字声明变量 I 来更改此行为。

      【讨论】:

        【解决方案3】:

        假设这段代码

        console.log("a"),
        setTimeout(function() {
          console.log("b");
        },3000);
        console.log("C")
        

        代码的输出将是a, C, b 由于 setTimeout 是一个回调函数。回调函数在执行函数中存在的每一行代码后执行。用这个理论相应地制作你的代码,它可能会帮助你理清你的概念。谢谢

        【讨论】:

          猜你喜欢
          • 2015-03-28
          • 1970-01-01
          • 1970-01-01
          • 2019-08-03
          • 1970-01-01
          • 2012-06-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多