首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >setTimeout在javascript中执行for循环后执行

setTimeout在javascript中执行for循环后执行
EN

Stack Overflow用户
提问于 2018-10-16 07:39:57
回答 6查看 1.1K关注 0票数 1

如果我们在setTimeout循环之前运行for (这需要5-8秒),然后在chrome dev控制台中运行,那么执行的顺序应该是

  1. 第一setTimeout
  2. 第二for回路
  3. 最后console.log setTimeout(函数(){ console.log('setTimeout执行“);},1000);for(var i=0;i<10000;i++){ console.log('inside for循环‘);} console.log('after For循环’);

但事实并非如此,命令变成:

  1. 第一for回路
  2. 二次console.log
  3. 最后是setTimeout

为什么会发生这种情况?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-10-16 07:47:22

JS是同步的因此,所有同步代码都是首先完成的,所有异步代码都在单独的线程中进行,它们可能会提前完成,但它们必须等到所有同步代码完成后才能完成。

代码语言:javascript
运行
复制
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引擎是如何工作的,请阅读。这是非常基本的,并有很大帮助。

票数 6
EN

Stack Overflow用户

发布于 2018-10-16 07:43:22

如果您想知道为什么是,则setTimeout是异步的。Javascript只保证这个回调不会在您指定的时间之前被调用,但并不保证它会在指定的时间之后被调用。它将调用放在事件队列中(我认为),如果其中有其他内容,则必须等待回调。

你可以在“你不了解JS”的书中学到更多的东西,你可以找到这里,阅读异步部分。

票数 1
EN

Stack Overflow用户

发布于 2018-10-16 07:42:33

在计时器过期后,setTimeout以匿名函数的形式运行您提到的代码。在您的例子中,它执行:

代码语言:javascript
运行
复制
function(){
    console.log('setTimeout executes');
}

这并不会停止javascript的正常流。

为了得到你想要的流程,你需要这样做:

代码语言: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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52830273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档