【问题标题】:for loop with setTimeout prints number to console带有 setTimeout 的 for 循环将数字打印到控制台
【发布时间】:2017-08-26 19:27:30
【问题描述】:

我阅读了关于闭包的文章并找到了这段代码。

for(i=0;i<5;i++){
    setTimeout(function(){
        console.log(i);
    },2000)
}

这会在 2 秒后输出 5 个数字 5 次。我明白这一点,但在五个出现之前,他的上方有一个数字。当我再次执行此代码时,它会更改它会将 5 添加到他的旧值。它是什么?在控制台上写代码,看看它输出什么然后解释一下它是什么?

【问题讨论】:

  • 屏幕截图或至少从您的控制台粘贴将有助于澄清您的问题。
  • @Bergi - 这是一个单独的 for 循环...只需将其粘贴到您自己的控制台中。
  • 也忘了var i;
  • @Bergi - 这就是他的问题的本质。事实上,在 setTimeout 的输出上方会出现一个随机数。他的问题实际上是“这个数字是多少?”。如果他不知道数字是多少,他应该如何更具描述性?
  • @Bergi 这是截图

标签: javascript for-loop console settimeout


【解决方案1】:

它是评估语句的“结果”值,对于循环来说,它是循环体中最后一条语句的结果值,也就是setTimeout 调用的返回值。和that returns 一个定时器ID(它允许你取消超时)。

您还可以通过更简单的语句来查看此行为:

> 0;
< 0
> console.log(1);
  1  // the output of the log()
< undefined
> var i=2;
< undefined // a declaration has no result
> var i=3; i;
< 3
> for (;i<3;i++) 4;
< undefined // the body was not evaluated
> for (;i<4;i++) 5;
< 5

注意前导箭头如何表示输入和结果输出。

【讨论】:

  • 我从来没有关注过那些小小的> 很好的解释:)
  • 我觉得奇怪的是var a = 3; 输出undefined,var b = 3; b; 输出3,但var c = 3; c; var d = 3; 输出3 而不是undefined。所以最终的输出不仅仅是多语句行中最后一条语句的结果。
【解决方案2】:
That number is the intervalID

代码:当您在浏览器调试器中运行以下代码时

setTimeout(() => console.log('hello'), 2000);

回应会是这样的

> 1822
> hello

您可以使用该 intervalID 来清除超时

只是为了向您显示该号码作为间隔ID的确认

> var test = setTimeout(() => console.log('hello'), 2000); test;
< 11272
  hello
> console.log(test);
  11272
< undefined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多