在js中执行顺序?

在js中,假设执行五万条log(1)需要5秒钟,在这个js中的第一行写个setTimeout一秒后执行log(2),这个log(2)是一秒后执行还是log(1)执行完以后再执行?

阅读 5.8k
7 个回答
  • log(1)执行完以后再执行。这里涉及到浏览器端的js事件循环机制。js代码由上到下执行,在调用栈里面执行。
  • 执行到setTimeout函数,是宏任务,放到回调队列里面。
  • 然后继续执行调用栈里面的代码,五万条log(1),是同步任务,在调用栈里面执行,一条一条先进先出。
  • 等到过了1秒后,setTimeout函数执行完。但是此时的调用栈还没有空,继续等待,等到5秒后,调用栈空了,就会执行回调队列里面的任务。此时打印log(2)
  • 附上js事件循环的链接:https://segmentfault.com/a/11...

至少在5秒后执行,setTimout只保证在一秒后把待执行函数推到待执行队列中,至于主线程什么时候有空,能够执行回调时不能确定的

setTimeout是异步,log是同步,尽管设置了1秒,但同步没执行完,异步就得排队

主线程是顺序执行的,也就是说,setTimeout要等到调用的时候才触发定时执行。

log(1)是主线程,setTimeout是宏任务,只有主线程的任务队列空了才会去执行宏任务

首先你要理解 setTimeout 并不是 1秒后执行对应函数
而是 1 秒后把对应的函数 放入执行队列, 如果执行队列同步函数 1 小时也得等着
可以看下这篇 eventLoop 希望可以帮助你
https://segmentfault.com/a/11...

image.png
经测试,高赞答案正确,等待所有同步任务完成之后,在执行异步任务

推荐问题
宣传栏