function waitForThreeSeconds(){
setTimeOut(function(){
console.log('Time done');
},3000);
}
waitForThreeSeconds();
console.log('finished execution');
在上面的代码中,当调用waitForThreeSeconds函数时,会在setTimeout方法的事件队列上放置一个事件。我的问题是当调用waitForThreeSeconds函数时,当JS引擎遇到setTimeout方法时,函数表达式中传递给setTimeout的三秒计时器会立即启动吗?或者将事件放在事件队列中。然后在console.log("完成执行')代码行在全局执行上下文中运行(这意味着所有内容都在JS文件中执行),然后三秒计时器将启动并回调函数传递给setTimeout将运行。
我不确定setTimeout函数中的计时器何时实际启动。它会在JS引擎遇到setTimeout方法时启动,还是在JS引擎进入事件队列以处理setTimeout方法放置的事件时启动三秒计时器?
答案 0 :(得分:1)
正如我们应该已经知道的那样,JavaScript不是一种多线程语言,因此它是一种单线程语言,尽管您可以添加事件,终止事件,甚至调用事件。
创建事件时,您可以在队列顶部添加事件标记,因此它将是最后一个要识别的事件。
在您的代码中,会发生以下情况:
waitForThreeSeconds()
:
呼叫等待三秒
致电setTimeout([...], 3000)
:
将事件添加为事件队列中的最后一个标记
此时您的事件队列应如下所示:
[this.event,that.event,all.otherEvents,ECMA.TimeStamp(3000)
]
TimeStamp(3000)是我们代表计时器的方式......
因此,每抽1/1000秒(抽象地)JS引擎将检查事件队列中是否有被调用的事件。当它识别出TimeStamp(3000)
已被调用(3000毫秒后)时,它将调用回调函数。
奇怪的是,当你说setTimeout([...], 3000)
时,JS引擎会将回调添加到事件队列中,并从那里继续前进。它不会等待3秒钟继续下一行代码。
因此,只要您拨打setTimeout()
,它就会启动计时器。因此,如果运行其余代码需要2000毫秒,那么1000毫秒之后将调用您的回调... =)
答案 1 :(得分:-1)
setTimeout
被添加到"任务队列结束的任务中":
function waitForThreeSeconds(){
setTimeout(function(){
console.log('Time done');
},0);} waitForThreeSeconds();console.log('finished execution');