Console.log()和settimeout(fn,0)

时间:2015-03-09 20:58:24

标签: javascript asynchronous google-chrome-devtools

关于我在Chrome控制台中运行的以下代码,我有几个问题(我强调了每个循环之间的区别)。代码的目的是立即打印出偶数数字,然后按顺序打印出奇数(因为堆栈是清晰的,Chrome开始在事件队列中运行,根据我的理解)。

  1. 对于第一个循环,为什么会显示undefined?为什么左侧有小undefined

  2. 对于第二个循环,为什么1会打印它的位置?看起来这是控制台正在做的事情,而不是我的代码。

  3. 对于第二个循环,为什么2打印出来? for循环严格小于2.

  4. 为什么第三个循环打印undefined3?控制台实际上没有打印符号旁边的数字有什么不同?

  5. 对于最后一个循环,为什么没有打印13?好像有点打印4 3次。

  6. 如何以这种方式使用setTimeout完成代码的意图?

  7. console.log and set timeout

    如果您自己尝试使用代码,则每次运行循环时,旁边的数字似乎会递增。

2 个答案:

答案 0 :(得分:2)

您需要使用Immediately Invoked Function Expression(IIFE)绑定i的当前值

示例:

for( var i = 0 ; i < 5 ; i++) {
    if(i % 2 == 0) {
        console.log(i);
    } else {
        (function(_i) {
            setTimeout(function() { console.log(_i); }, 0);
        })(i);
    }
}

答案 1 :(得分:2)

  

对于第一个循环,为什么它显示未定义?为什么undefined左边有小

<-表示返回值。代码不会返回任何内容。

  

对于第二个循环,为什么1打印它的位置?看起来这是控制台正在做的事情,而不是我的代码。

在这里,代码确实返回了一些内容:1。这是setTimeout的ID。

  

对于第二个循环,为什么2打印出来? for循环严格小于2。

请参阅JavaScript closure inside loops – simple practical example - 在代码运行时,i现在为2。

  

为什么第三个循环打印未定义且3?有什么不同,控制台实际上没有打印出&lt;·符号旁边的数字?

undefined是循环返回的最后一个值 - console.log()的值。超时记录3

  

对于最后一个循环,为什么没有打印1和3?好像它打印了4次3次。

     

如何以这种方式使用setTimeout完成代码的意图?

再次查看JavaScript closure inside loops – simple practical example