美文网首页
js运行机制

js运行机制

作者: 香蕉不拿呢 | 来源:发表于2021-12-29 23:34 被阅读0次

关于javascrip运行机制的文章有很多,每个人对其的理解都大同小异,
这篇文章记录自己对javascipt运行机制的一个梳理。
javascript是单线程语言,意味着一次只能执行一个任务,所有任务都需要排队,前一个任务执行完,才能执行后一个任务。
为了协调事件、用户交互、脚本、UI 渲染和网络处理等行为,防止主线程的阻塞,Event Loop 的方案应用而生。
主线程运行时会产生执行栈,栈中的代码调用某些api时,它们会在任务队列中添加各种事件
而栈中的代码执行完毕,就会读取任务队列中的事件,去执行那些回调
如此循环
注意,总是要等待栈中的代码执行完毕后才会去读取任务队列中的事件

1.同步任务 异步任务

所有任务可以分为同步任务异步任务
同步任务:在主线程上排队执行,前一个任务执行完,才能执行后一个任务。
异步任务:不进入主线程,进入任务队列,当任务队列通知主线程,某个异步任务能执行了,该异步任务才进入主线程执行。
同步代码直接执行
异步函数到了指定时间再放到异步队列
同步执行完毕,异步队列轮询执行。

2.执行栈 任务队列

执行栈:同步任务在主线程中执行,形成执行栈。
任务队列:事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。
当执行栈中的任务执行完,主线程就去任务队列中找哪些任务是可以结束等待的,把结束等待的任务放入主线程中执行

3.宏任务 微任务

异步任务又分为两种,宏任务微任务
宏任务: setTimeout,setInterval,postMessage等
微任务: promise.then,await(await会阻塞后面的逻辑代码,等主线程执行完毕,才执行await后面的逻辑)等
当执行栈中的任务为空时,就会去任务队列中找,总是先找微任务的,再找宏任务的。
微任务队列优先于宏任务队列执行,
微任务队列上创建的宏任务会被后添加到当前宏任务队列的尾端,微任务队列中创建的微任务会被添加到微任务队列的尾端。
只要微任务队列中还有任务,宏任务队列就只会等待微任务队列执行完毕后再执行

4.流程图

文字比较抽象,流程图思路会清晰


js运行机制.png
5.总结

简言之就是JS只有一个主线程,主线程执行完执行栈的任务后去检查异步的任务队列,如果异步事件触发,则将其加到主线程的执行栈。

相关文章

  • 最全js运行机制

    js运行机制

  • js new 运行机制

    js手札--js中new到底做了些啥JS核心系列:理解 new 的运行机制深入理解 Javascript 运行机制及原型

  • 浅析Vue.nextTick()原理

    1、为什么用Vue.nextTick() 首先来了解一下JS的运行机制。 JS运行机制(Event Loop) J...

  • 运行机制,宏任务 与 微任务

    运行机制: JS 的本质是单线程执行 事件队列:同步任务,异步任务() 运行机制 1,JS 的本质是单线程执行 单...

  • 前端知识点

    JS 1. 事件循环 「硬核JS」一次搞懂JS运行机制[https://juejin.cn/post/684490...

  • js运行机制

    js运行机制 在日常面试求职中,不免会做几道面试题,这面试题中往往会遇到js执行输出顺序,而这运行机制是我们每个前...

  • Event Loop

    关于浏览器的多进程,JS单线程等涉及浏览器整体运行机制、浏览器内核、JS运行机制,请看这篇文章,全是干货,什么时候...

  • JS的运行机制

    title: JS的运行机制date: 2018-12-28 11:02:52tags: js 为什么JavaSc...

  • JavaScript执行机制、Event Loop

    一、运行机制 JavaScript是单线程运行机制。 为什么JavaScript是单线程?单线程就是说,js在同一...

  • JS运行机制

    JS运行机制 如果一个文档流中包含多个script代码段(用script标签分隔的js代码或引入的js文件),运行...

网友评论

      本文标题:js运行机制

      本文链接:https://www.haomeiwen.com/subject/inibqrtx.html