一段JavaScript代码是如何执行的

   日期:2020-05-11     浏览:117    评论:0    
核心提示:一段JavaScript是如何执行的js事件循环异步任务异步任务队列测试代码结果调试执行结果js事件循环当我们执行一行js代码时,如果是同步任务,就把它直接放到执行栈里面去执行,如果是异步任务,会把它放到一个异步的任务队列中,等待同步任务执行完,然后再从异步任务中读取异步任务.异步任务异步任务又分为 “宏任务” 和 “微任务”.宏任务是宿主环境提供的. 例如setTimeout()以及正常的js脚本.微任务是由语言标准提供的. 像平时用的 promise,nextTick异步任务javascri

一段JavaScript是如何执行的

  • js事件循环
  • 异步任务
  • 异步任务队列
  • 测试代码
    • 结果调试
    • 执行结果

js事件循环

当我们执行一行js代码时,如果是同步任务,就把它直接放到执行栈里面去执行,如果是异步任务,会把它放到一个异步的任务队列中,等待同步任务执行完,然后再从异步任务中读取异步任务.

异步任务

异步任务又分为 “宏任务” 和 “微任务”.

  • 宏任务是宿主环境提供的. 例如setTimeout()以及正常的js脚本.
  • 微任务是由语言标准提供的. 像平时用的 promise,nextTick

异步任务队列

异步任务队列里又有 “宏任务队列” 和 “微任务队列” ,如果同步任务执行完了,然后会先去执行微任务,会把所有的微任务执行完,才会去执行新的一轮宏任务.

测试代码

// 同步任务
console.log("script start");

// 异步任务 --- 宏任务
setTimeout(() => {
  console.log("setTimeout1");
}, 0);

// 异步任务 --- 微任务 (如果是 new Promise()则是同步任务, 切记)
Promise.resolve()
  .then(function () {
    console.log("promise1");
  })
  .then(function () {
    console.log("promise2");
  });

// 异步任务---宏任务
setTimeout(() => {
  console.log("setTimeout2");
}, 0);

// 同步任务
console.log("script end");

结果调试

执行console.log("script start"); 因为它是同步代码所以立即打印 script start

执行到setTimeout()时,因为它不是一个同步任务,所以会先将它放到异步任务队列中,等待同步任务执行结束才会执行.

同上

执行到console.log("script end");时,因为是同步任务,所以立即输出 “script end”

现在同步任务已经处理完成, 接着就是处理异步任务. 因为 “宏任务” 执行顺序优先于 “微任务”, 所以会先去执行 Promise

异步队列宏任务处理完, 接着 去处理异步队列的 “微任务”

执行结果

script start
script end
promise1
promise2
setTimeout1
setTimeout2
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服