JS 执行机制杂记

JS 是一门单线程语言、解释型语言(Python同为解释型,相对于编译型存在),虽然最新的HTML5 提出了 web-Worker,但是 javascript 是以单线程为核心,所以一切多线程

JS 运行机制

以下笔记摘录自阮一峰老师笔记,JavaSvcript 运行机制详解:再谈Event Loop

任务队列

因为 JS 为单线程,所以所有任务都需要进行排队,自然如果前一个任务用时过长(像IO操作),就会导致整个队列阻塞,所以就需要将一些任务进行挂起。

于是将所有任务分为两种,一种为同步任务(synchronous),另一种是异步任务

(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
(4)主线程不断重复上面的第三步。

上面只是简单的说到同步任务与异步任务的执行顺序,接下来说明如何进行异步任务

image.png

首先异步任务必须指定回调函数(callback),这段代码就是会被主线程挂起的代码。异步任务进入 event table,当指定事情完成后,就将异步任务加入 Event Queue,等待主线程上的任务完成后,就执行Queue 里的异步任务,也就是执行对应的回调函数

异步任务有更精细的定义:

  • macro-task(宏任务)包括整体代码 script,setTimeout,setInterval,setImmediate(node.js)
  • micro-task(微任务) Promise,process.nextTick(node.js)
image.png

给个例子

console.log("start");
setTimeout(function() {
    console.log('setTimeout');
})

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

console.log('end');

打印的顺序为:

start
create promise
end
promise then

以上部分内容摘录引用自
这一次,彻底弄懂 JavaScript 执行机制

你可能感兴趣的:(JS 执行机制杂记)