setTimeout计时器事件

时间:2015-11-06 03:29:09

标签: javascript timer

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方法放置的事件时启动三秒计时器?

2 个答案:

答案 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');