百字看懂JS运行机制 事件循环

作者: sylvia_yue | 来源:发表于2021-03-09 15:30 被阅读0次

JS 的运行机制

小回顾: 上一篇进程与线程中介绍到前端操作主要是在 渲染进程 中进行,而渲染进程中包含一些常用的且与JS运行相关的线程:JS 引擎线程、事件触发线程、定时器线程。

1. JS 是单线程的

  • JS 分为 同步任务和异步任务
  • 同步任务在主线程上执行,形成一个 执行栈;
  • 事件触发线程维护一个 事件队列,当异步任务有了运行结果,就会被添加到事件队列尾部,等待 JS 引擎空闲时来执行;
  • 执行栈 中的任务都执行完成,系统就会读取事件队列,将可执行的任务添加到 执行栈 中,进行执行。

上述过程就是所说的 事件循环

2. 宏任务、微任务

  • 宏任务: 任务队列中的任务(相当于同步任务和部分异步任务:定时器),在执行栈上按顺序依次执行,每个任务会完整执行,过程中不可被打断;
  • 微任务: 异步任务的一种,如 promise、MutationObserver,存在于微任务队列中,穿插于执行栈中的任务间执行(可插队执行,因此快于 setTimeout 的响应),JS 会循环检查为任务队列中是否有微任务,一但执行栈中的一个任务执行完成,且有微任务在等待,则会把微任务队列中的微任务全部执行。

注: 对宏任务微任务执行顺序的处理各浏览器可能会有些差异,但总结本文时在 chrome、safari、firefox 上尝试均已统一。

3. 示例

搞清楚下面的例子你就所向披靡了~
ps:例子原文为一片英文文章,值得一看 https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ ,配合动图会更清晰。

3.1 示例一

console.log('script start');

setTimeout(function () {
  console.log('setTimeout');
}, 0);

Promise.resolve()
  .then(function () {
    console.log('promise1');
  })
  .then(function () {
    console.log('promise2');
  });

console.log('script end');

执行结果:

script start
script end
promise1
promise2
setTimeout

3.2 示例二

html

<div class="outer">
  <div class="inner"></div>
</div>

javascript

// Let's get hold of those elements
var outer = document.querySelector('.outer');
var inner = document.querySelector('.inner');

// Let's listen for attribute changes on the
// outer element
new MutationObserver(function () {
  console.log('mutate');
}).observe(outer, {
  attributes: true,
});

// Here's a click listener…
function onClick() {
  console.log('click');

  setTimeout(function () {
    console.log('timeout');
  }, 0);

  Promise.resolve().then(function () {
    console.log('promise');
  });

  outer.setAttribute('data-random', Math.random());
}

// …which we'll attach to both elements
inner.addEventListener('click', onClick);
outer.addEventListener('click', onClick);

执行结果:

click
promise
mutate
click
promise
mutate
timeout
timeout

参考:

http://www.dailichun.com/2018/01/21/js_singlethread_eventloop.html
https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

相关文章

  • 百字看懂JS运行机制 事件循环

    JS 的运行机制 小回顾: 上一篇进程与线程[https://www.jianshu.com/p/5964c65d...

  • Vue源码分析—响应式原理(四)

    nextTick JS 运行机制 JS 执行是单线程的,它是基于事件循环的。事件循环大致分为以下几个步骤: 所有同...

  • 前端知识点

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

  • Js 的多宿主时代

    之前有写过一篇文章 Js运行机制深层剖析,主要讲的是 Js 的事件循环机制 (Event Loop),从现在的眼光...

  • Event Loop

    JS 主线程不断的循环往复的从任务队列中读取任务,执行任务,这种运行机制称为事件循环(event loop)推荐看...

  • 夯基础- js event loop机制

    js运行机制 event loop事件循环 js分为同步任务和异步任务,所有的同步任务都在主线程上执行 另外存在着...

  • 再看浏览器事件循环和NodeJS事件循环

    事件循环是浏览器和Node用来解决JS单线程运行带来的问题的一种运行机制。浏览器和NodeJS环境下的事件循环是不...

  • JavaScript-事件循环

    参考JavaScript运行机制之事件循环(Event Loop)详解 从setTimeout说事件循环模型 单...

  • 前端干货:JS的执行顺序

    JS的运行机制 先来一个今日头条的面试题 1. 单线程的JavaScript js是单线程的,基于事件循环,非阻塞...

  • JS 运行机制

    关于Js的运行机制,经常会看到一下重要概念:单线程,事件,回调,事件循环,执行栈,任务队列,异步以及相关的函数se...

网友评论

    本文标题:百字看懂JS运行机制 事件循环

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