Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
setTimeout在javascript中的工作原理(理论上)_Javascript - Fatal编程技术网

setTimeout在javascript中的工作原理(理论上)

setTimeout在javascript中的工作原理(理论上),javascript,Javascript,为什么setTimeout在alert(2)之后启动函数,即使我将时间设置为0。我认为javascript是同步语言 我只是想从理论上了解异步在javascript中是如何工作的。当javascriptinterpreator遇到setTimeout时会发生什么,当遇到其他函数时会发生什么 编辑: setTimeout(function(){ alert(0) },0) alert(1) alert(2) JavaScript是单线程的。JS将尝试尽可能接近setTimeout函数提供的超

为什么
setTimeout
alert(2)
之后启动函数,即使我将时间设置为0。我认为javascript是同步语言

我只是想从理论上了解异步在javascript中是如何工作的。当javascript
interpreator
遇到
setTimeout
时会发生什么,当遇到其他函数时会发生什么

编辑:

setTimeout(function(){
alert(0)
},0)


alert(1)
alert(2)

JavaScript是单线程的。JS将尝试尽可能接近setTimeout函数提供的超时时间,但只有在线程不忙于其他事情时才会触发(例如等待用户在警报弹出窗口中单击
OK


因此,如果您有一个需要很长时间才能运行的JS脚本,并且其中有几个具有不同超时长度的if超时,那么它们只能在JS线程使用该脚本中的其余代码完成时触发

JavaScript使用事件循环来执行代码。此循环从队列中获取事件并执行附加到队列的代码

在当前事件中,调用
setTimeout
,并将新事件放入该队列。
setTimeout
调用立即返回(函数不执行,只需放入队列)

然后继续执行当前代码,直到完成当前事件(我假设您对
alert()
的调用在这里)


当前事件完成后,循环将从队列中选择下一个事件;这就是您使用
setTimeout

设置的函数,其中有一个事件循环。检查一下:
setTimeout
是一个合成延迟,即使超时设置为0,在其中调用的函数也不会同步调用。在清除当前调用堆栈(即,下一个事件循环迭代)后,将调用(最早)它们。这是一件好事-它阻止了的发布。@amit根据您的编辑,预期的执行将是1、2和0的警报。如果我理解,setTimeout将添加到回调队列中,浏览器每次都会询问以下问题:等待执行的是什么?
alert
阻止执行(如PHP中的
sleep
语句),所以线程实际上什么都没做。它只需等待用户单击
OK
按钮,然后再选择停止的位置。我建议您阅读评论中已经提到的链接中的文本。这是一本好书。我假设这是队列['setTimeout','alert(1)','alert(2)'。当遇到setTimeout时,它返回false,然后循环转到下一个事件。所以当它返回到setTimeout时。@amit不是真的。队列以
[your code]
开头,其中
your code
是三条语句setTimeout-alert1-alert2。在执行第一条语句(setTimeout)时,您的队列是
[您的代码(正在运行),警报0]
。您的代码继续运行其他两个挂起语句(警报1和警报2)并完成。您的代码将从队列中删除,下一个事件(警报0)将被执行。因此,一旦它们执行,它们将从队列中删除?是。实际上,在执行开始或结束时从队列中删除事件是JavaScript引擎供应商的内部设计决策。但关键是所有代码都进入一个队列,事件循环使用/执行这些条目。通过调用
setTimout
,您可以为队列提供数据。