Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.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
什么决定了Javascript中被读取的行的顺序?_Javascript_Runtime - Fatal编程技术网

什么决定了Javascript中被读取的行的顺序?

什么决定了Javascript中被读取的行的顺序?,javascript,runtime,Javascript,Runtime,这个例子是在一个演示中给出的,期望1,2,3作为这些函数的运行顺序,但实际上是1,3,2。奇怪为什么setTimeout函数会最后运行 console.log(1) setTimeout(() => console.log(2), 0) console.log(3) setTimeout的回调是异步的,因此它可能已注册为被激发*,但这需要足够长的时间来注册该控制台。log3将有时间运行到该点 在处理异步代码时,您通常无法保证它的运行顺序 *老实说,我不知道setTimeout的内部结构,

这个例子是在一个演示中给出的,期望1,2,3作为这些函数的运行顺序,但实际上是1,3,2。奇怪为什么setTimeout函数会最后运行

console.log(1)
setTimeout(() => console.log(2), 0)
console.log(3)
setTimeout的回调是异步的,因此它可能已注册为被激发*,但这需要足够长的时间来注册该控制台。log3将有时间运行到该点

在处理异步代码时,您通常无法保证它的运行顺序


*老实说,我不知道setTimeout的内部结构,这可能取决于所使用的具体实现。关键是它的回调是异步运行的

异步回调,就像上面传递给setTimeout的回调一样,被放入一个队列中,当脚本的主同步主体运行到完成时调用

因此,顺序是:

console.log(1)
setTimeout() // but not the callback
// put callback in queue
console.log(2)

// take item from queue and run
() => console.log(2)
这样做的一个结果是,传递给setTimeout的时间是回调触发之前的最短时间。如果主同步任务花费的时间超过此时间,则回调将延迟触发

您可以通过运行长时间运行的while循环来演示这一点。但请不要在真实代码中这样做

让我们开始=Date.now 现在开始 让那时=现在+3000; //将计时器设置为100毫秒 setTimeout=>console.logtimeout,Date.now-开始,毫秒,100 //慢循环需要3000毫秒 此时此刻{ now=Date.now }
console.logloop done因为settimeout是异步的,并且不能很容易地阻止执行,所以这是因为该函数特定,谢谢你没有意识到settimeout是异步的,非常感谢!Neat@DanFein请注意,它必须是。如果它被阻止,那将导致各种各样的问题。还要考虑一个类似于setInterval的函数。如果被阻止,除非它是自动终止的,否则在使用时必然会冻结整个站点;除了回调更新的内容。