【问题标题】:setTimeout(function(){console.log(3)}, 0); it has value 0 [duplicate]setTimeout(function(){console.log(3)}, 0);它的值为 0 [重复]
【发布时间】:2015-03-22 20:14:18
【问题描述】:

当我在控制台中执行以下代码时,我得到1,4, undefined 3,2.

我想知道为什么它不以1,3,42 执行 因为在setTimeout(function(){console.log(3)}, 0); 中,毫秒参数是0

    (function() {
        console.log(1); 
        setTimeout(function(){console.log(2)}, 1000); 
        setTimeout(function(){console.log(3)}, 0); 
        console.log(4);
    })();

【问题讨论】:

  • undefined来自控制台,是函数执行的返回,不是console.log输出的
  • 它返回 1,4,3,2 因为当您使用 setTimeout 时,您将代码放在另一个线程中运行
  • 好的,错过了直接在控制台输入中输入的代码。否则在该脚本将永远不会记录的页面上undefined
  • 因重复而关闭,因此很好地解释了实际发生的情况。 阅读所有 cmets 和所有答案 导致接受的答案未正确到达浏览器队列。
  • @RokoC.Buljan 这不是问题的重点......而且没有公认的答案

标签: javascript function


【解决方案1】:

这是 John Resig 的精彩解释:http://ejohn.org/blog/how-javascript-timers-work/
但底线是 console.log(1) 和 (4) 被“内联”执行,2 和 3 被放置在事件队列中,直到所有内联代码都被执行后才被执行.因此,即使 (3) 的延迟为 0,它仍然会在所有语句执行后发生。
当我测试你的代码时,我也没有收到未定义的消息。

【讨论】:

    【解决方案2】:

    正如评论中提到的,undefined 是您的函数的返回值。

    4 出现在 3 之前的原因很简单,因为 JavaScript 中没有并行性,因此在您的函数返回之前无法执行计时器回调。

    【讨论】:

      【解决方案3】:

      简短回答:undefined 来自您的 javascript 控制台中执行语句的结果,该函数不返回任何内容,因此未定义

      让我们试着分解一下:

      1. console.log(1); // 1
      2. console.log(4); // 4
      3. 你执行的代码返回undefined
      4. setTimeout(function(){console.log(3)}, 0); // 3 执行下一个堆栈
      5. setTimeout(function(){console.log(2)}, 1000); // 2 1 秒后

      编辑: 测试一下

      var a = (function(){})(); // print undefined, a is also undefined, no returned value
      

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多