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)
给个例子
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 执行机制
网友评论