JS 中的过程、线程、工作队列、事件循环、宏工作、微工作、执行栈等概念了解
javascript 中有很多须要晓得的概念,尤其是题目中列出来的这些,明天就来过一下这些概念。
一、过程和线程
浏览器的每一个 tab 页能够看做是浏览器内核过程,每个过程上面会有多个线程来互相配合实现工作
比方 GUI 线程、JS 引擎线程、网络线程、定时器线程等
二、工作队列
工作队列能够当做是一个个的对调工作,当主线程的工作实现后,就开始执行工作队列中的工作(如果当前任务队列中再增加了新的异步工作,则其回调函数会放在之后的工作队列中)
三、事件循环
异步工作执行后,其回调会放到工作队列中。当主线程工作执行完结后,就去工作队列中捞接下来要做的工作,放到主线程中执行,直到工作全副完结。如果无新的工作可做,浏览器处于期待状态,晓得新的内部输出、事件触发,这样一个循环过程称为事件循环。
四、宏工作和微工作
工作队列中有两种工作,一种是宏工作一种是微工作。具体概念我也没有查到,然而能够这样去了解,微工作就是执行完以后主线程工作后就要马上执行的工作,宏工作则是要放到下一次的事件循环中的主线程中的工作。
个别的宏工作有 setTimeout 和 setInterval
微工作则有 promise、process.nextTick 等
五、执行栈
执行栈是解释器追踪函数执行流的一种机制。当引擎第一次遇到 js 代码时,会产生一个全局执行上下文压入执行栈,每遇到一个函数调用,就往栈中压入一个新的上下文。引擎执行栈顶的函数后则弹出以后执行上下文直至函数顺次执行结束并回到全局的上下文。
测试
有趣味的同学能够试试上面代码的输入程序
setTimeout(function () {console.log('1')
});
new Promise(function (resolve) {console.log('2');
resolve();}).then(function () {console.log('3')
setTimeout(function () { console.log('5')
});
});
console.log('4');
遇到第一个 settimeout 时,先把整体代码块放到第一个宏工作中,遇到 promise,先执行外部的代码,把 then 中的代码放到为工作中。遇到 console.log(4) 在主线程中间接执行。之后先从微工作中捞取工作执行 console.log(3) 并把前面的 setTimeout 放到下一个宏工作队列(第二个)中。而后从以后宏工作队列中捞取要执行的代码,打印 1。而后开始到下一个事件循环,把宏工作的代码捞进去执行。
所以程序是 24315