即使setTimeout设置为0延迟,为什么会出现延迟?

时间:2016-04-18 02:12:03

标签: javascript

console.log('one');
setTimeout(function() {
  console.log('two');
}, 0);
console.log('three');

输出是: '一个' ' 3' ' 2'

幕后会发生什么?为什么代码产生这个输出?

3 个答案:

答案 0 :(得分:5)

setTimeout()不执行给定的函数"在X秒之后你声明它",在幕后,这个方法将给定的函数放入一个将被执行的堆栈中# 39; X秒之后执行上下文中的代码已经执行,在这种情况下,代码的第1行和第4行已被执行"

一个例子

setTimeout(function() {
  console.log('four');
}, 10);
console.log('one');
setTimeout(function() {
  console.log('two');
}, 0);
console.log('three');

//输出:'一个','三个','两个''四个'

在幕后:

在执行上下文中

console.log('one');
console.log('three');
执行上下文后

setTimeout(fn, ms)按第二个参数的顺序排序,以毫秒为单位:

console.log('two');//0 ms after the execution context has been executed.
console.log('four'); //10ms after the execution context has been executed

编辑:已经搜索了下一个响应中以图形方式解释javascript浏览器队列工作原理的链接,请查看它!

答案 1 :(得分:2)

javascript解释器在大事件循环中运行所有代码单线程;你的调用setTimeout将回调列为​​当前代码完成时要执行的另一个事件(以及之前可能已排队的其他代码)。

所以解释器就像这样执行它:

get and execute next event
  calling your global <script> code
    calling console.log('one');
    calling setTimeout(func);
    calling console.log('three');
  returning from your global <script> code
get and execute next event*
  calling setTimeout callback
    calling console.log('two');
  returning from setTimeout callback

(*):在这两者之间可能会有其他要回调的回调。

答案 2 :(得分:1)

Javascript使用事件循环来执行异步代码。 Javascript是单线程的,因此所有回调都是使用回调队列逐个运行的。代码以一系列&#34; ticks&#34;运行。这意味着队列处理仅在前一个完成时发生。这里setTimeout注册一个回调并返回。下一行代码将被执行,因此它们将首先在此调用堆栈中执行。在没有任何事情要执行之后,注册的回调将被执行。

这里给出了一个直观的解释: http://latentflip.com/loupe/?code=Y29uc29sZS5sb2coJ29uZScpOwpzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogIGNvbnNvbGUubG9nKCd0d28nKTsKfSwgMCk7CmNvbnNvbGUubG9nKCd0aHJlZScpOw%3D%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D