console.log('one');
setTimeout(function() {
console.log('two');
}, 0);
console.log('three');
输出是: '一个' ' 3' ' 2'
幕后会发生什么?为什么代码产生这个输出?
答案 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注册一个回调并返回。下一行代码将被执行,因此它们将首先在此调用堆栈中执行。在没有任何事情要执行之后,注册的回调将被执行。