当我在控制台中执行以下代码时,我得到1,4, undefined 3,2.
我想知道为什么它没有作为1,3,4
和2
执行
因为在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);
})();
答案 0 :(得分:5)
这是John Resig的一个很好的解释:http://ejohn.org/blog/how-javascript-timers-work/
但是底线是console.log(1)和(4)'在线'执行,2和3放在事件队列中,并且在执行所有内联代码之前不执行。因此,即使(3)的延迟为0,它仍然会在所有语句执行后发生
当我测试你的代码时,我没有得到未定义的消息。
答案 1 :(得分:4)
如评论中所述,undefined
是函数的返回值。
4
之前出现3
的原因只是在JavaScript中没有并行性,因此在函数返回之前,定时器回调无法执行。
答案 2 :(得分:3)
简答:undefined
来自你的javascript控制台中执行语句的结果,函数什么都没有返回,所以未定义
试着分解一下:
console.log(1);
// 1
console.log(4);
// 4
undefined
setTimeout(function(){console.log(3)}, 0);
// 3
执行下一个堆栈setTimeout(function(){console.log(2)}, 1000);
// 2
在编辑: 测试这个
var a = (function(){})(); // print undefined, a is also undefined, no returned value