如果我们在setTimeout
循环之前运行for
(这需要5-8秒),然后在chrome dev控制台中运行,那么执行的顺序应该是
setTimeout
for
回路console.log
setTimeout(函数(){ console.log('setTimeout执行“);},1000);for(var i=0;i<10000;i++){ console.log('inside for循环‘);} console.log('after For循环’);但事实并非如此,命令变成:
for
回路console.log
setTimeout
为什么会发生这种情况?
发布于 2018-10-16 07:47:22
JS是同步的因此,所有同步代码都是首先完成的,所有异步代码都在单独的线程中进行,它们可能会提前完成,但它们必须等到所有同步代码完成后才能完成。
setTimeout(function(){
console.log('setTimeout executes');
},1000); // this function go async in separate thread
for(var i=0;i<10000;i++){
console.log('inside for loop'); // sync
}
console.log('after For Loop'); // sync
// after all sync code async result will be called
// console.log('setTimeout executes'); will happen here
如果您想全面了解JS引擎是如何工作的,请阅读这。这是非常基本的,并有很大帮助。
发布于 2018-10-16 07:43:22
如果您想知道为什么是,则setTimeout
是异步的。Javascript只保证这个回调不会在您指定的时间之前被调用,但并不保证它会在指定的时间之后被调用。它将调用放在事件队列中(我认为),如果其中有其他内容,则必须等待回调。
你可以在“你不了解JS”的书中学到更多的东西,你可以找到这里,阅读异步部分。
发布于 2018-10-16 07:42:33
在计时器过期后,setTimeout
以匿名函数的形式运行您提到的代码。在您的例子中,它执行:
function(){
console.log('setTimeout executes');
}
这并不会停止javascript的正常流。
为了得到你想要的流程,你需要这样做:
setTimeout(function(){
for(var i=0;i<10000;i++){
console.log('inside for loop');
}
console.log('after For Loop');
},1000);
要更好地理解这一点,您可以使用以下可视化工具:http://latentflip.com/loupe
https://stackoverflow.com/questions/52830273
复制相似问题