我一直在学习setTimeout
和同步与异步代码,我正在观看一个教程视频,他们展示了各种函数被调用并添加到调用堆栈中,例如一个简单地将两个数字相加的函数。
然而,对于setTimeout
,他们没有显示,当这被调用时,它被添加到调用堆栈中,我理解这触发了一个web API,回调被添加到队列中,但我很好奇,如果在setTimeout
被JS引擎执行的那一刻,它是否被添加到调用堆栈中?
在
setTimeout
被JS引擎执行的那一刻,它是否添加到调用堆栈中?
。而且,一旦注册回调,它就会从调用堆栈中弹出,所以这几乎不需要花费任何时间。
当给定的延迟通过后,回调将进入队列。然后,当调用堆栈为空时,JS将处理事件队列,并调用回调。这个回调也将被添加到调用堆栈中。
请注意,setTimeout
和回调将不会被添加到调用堆栈累积。可以保证在回调被推入之前,调用堆栈将首先被清空。
是的,在timeout中设置的时间过去后,回调被推送到调用堆栈&执行。
实际上,JS函数执行的唯一途径是通过调用堆栈。
Philip Roberts提供了一个很好的可视化工具loupe,它可以帮助理解调用堆栈&与之相关的事情
setTimeout将被推入调用堆栈,然后弹出。当它被弹出时,它被发送到浏览器API(如果代码在浏览器中执行)。API将等待指定的时间,并将回调发送到事件队列。当调用堆栈为空时,事件循环将从事件队列中获取回调(假设它是队列中的下一行),并在执行时将其放入堆栈中。