Javascript 设置超时计时器事件

Javascript 设置超时计时器事件,javascript,timer,Javascript,Timer,在上面的代码中,当调用waitForThreeSeconds函数时,会在setTimeout方法的事件队列中放置一个事件。我的问题是,当调用waitForThreeSeconds函数时,当JS引擎遇到setTimeout方法时,传递到setTimeout的函数表达式中的三秒计时器是否会立即启动?或者将事件放置在事件队列上。然后,在全局执行上下文中运行console.logfinished execution'行代码(这意味着在JS文件中执行的所有操作都已完成)后,将启动三秒计时器,并运行传递给s

在上面的代码中,当调用waitForThreeSeconds函数时,会在setTimeout方法的事件队列中放置一个事件。我的问题是,当调用waitForThreeSeconds函数时,当JS引擎遇到setTimeout方法时,传递到setTimeout的函数表达式中的三秒计时器是否会立即启动?或者将事件放置在事件队列上。然后,在全局执行上下文中运行console.logfinished execution'行代码(这意味着在JS文件中执行的所有操作都已完成)后,将启动三秒计时器,并运行传递给setTimeout的回调函数


我不确定setTimeout函数中的计时器实际何时启动。它是在JS引擎遇到setTimeout方法时启动,还是在JS引擎进入事件队列处理setTimeout方法放置的事件时启动三秒计时器?

我们已经知道,JavaScript不是多线程语言,因此是单线程语言,尽管您可以添加事件、终止事件甚至调用事件

创建事件时,将事件令牌添加到队列顶部,因此它将是最后一个要识别的事件

在您的代码中,会发生以下情况:

等待三秒钟: 电话等待三秒钟

调用setTimeout[…],3000: 将事件添加为事件队列中的最后一个令牌

此时,事件队列应该如下所示: [this.event,that.event,all.otherEvents,ECMA.TimeStamp3000]

时间戳3000是我们表示计时器的方式

因此,JS引擎每隔1/1000秒抽象地检查事件队列中已调用的事件。当它意识到TimeStamp3000在3000毫秒后被调用时,它现在将调用回调函数

奇怪的是,当您说setTimeout[…],3000时,JS引擎将回调添加到事件队列中,然后从那里继续。它将不会等待3秒钟来继续下一行代码

因此,只要调用setTimeout,它就会启动计时器。因此,如果运行剩下的代码需要2000毫秒,那么1000毫秒后您的回调将被调用=

如果您有任何问题,请留言 setTimeout被添加到任务队列末尾的任务中:

function waitForThreeSeconds(){
    setTimeOut(function(){
       console.log('Time done');
    },3000);
}

waitForThreeSeconds();
console.log('finished execution');

当函数被调用时,它被放置在堆栈的顶部,因此用您的术语来说,立即就是正确的!因此,从技术上讲,当其余代码运行时,计时器仍在运行。正确吗?JS引擎不太可能每毫秒轮询一次队列中的计时器事件,因为这在CPU使用率和电池寿命方面都非常低效。每个操作系统都支持计时器事件或计时器通知,在实际计时器启动之前,它们不需要CPU,也几乎不需要电池。这就是Javascript处理计时器事件的方式。它使用操作系统服务来计时。回答Clay Horder的问题:即使运行程序的其余部分需要4000毫秒,那么回调仍将在3000毫秒内调用,这意味着回调将被调用,然后1000毫秒后程序将完成运行,作为对jfriend00的响应,您完全正确,但是,尽管JS使用系统实用程序的时间很长,它仍然需要经常检查这些信息。因此JS将返回事件队列,并请求系统的日期和时间,以查看是否应该启动回调。现在,虽然每1ms检查事件是低效的,但这只是作为一个例子,而不是作为一个实际的表示。回答你的第一个问题:记住,尽管JavaScript有一个严格的规则,不停止在函数的中间做其他事情……setTimeout是一个基本函数,因此它将直接与浏览器通信。。。对于第二个问题,允许浏览器和引擎违反某些规则:如果打开控制台,再次查看console.log消息的右侧,您将看到一个红色圆圈,圆圈内有一个数字。。。浏览器会这样做,因为如果一个网页使用Console.log多次记录同一条消息,它可能是垃圾邮件,因此它不会多次记录同一条消息,而只是在其中放入一个带有数字的红色气泡,以表示它已被多次调用!
function waitForThreeSeconds(){
setTimeout(function(){
   console.log('Time done');
},0);} waitForThreeSeconds();console.log('finished execution');