-
JS是单线程
前一个任务执行完才能执行下一个任务,同一个时刻只能处理一个任务。js的宿主环境是多线程的浏览器、Node等,执行期环境是JS引擎。 -
JS通过Event loop实现异步。
-
JS分类
JS将任务分为同步和异步,异步任务可以是文件上传和下载、ajax操作等。 -
JS的执行机制
是Event Loop(事件循环):
1.同步任务进入主线程中,形成执行栈(Execution Context Stack)。异步任务进入事件表(Event Table)中注册函数。
2.当事件表中有结果返回时,此函数进入事件队列(Event queue)里。
3.主线程的任务都执行完成后,读Event queue里的函数,放入主线程执行。
以上过程不断循环。
- JS分类
JS也分为宏任务(Macro Task)和微任务(Micro Task)。
宏任务包含scipt(整体脚本),setTimeout,setInterval等
微任务包含Promise,process.nextTick等 - 执行机制:
有微任务执行微任务,无微任务执行宏任务。 - 举例说明附录代码的执行顺序。
第一轮:
此时无微任务,整体脚本作为一个宏任务进入主线程,输出1。
【输出:1】
【宏任务event queue:空】
【微任务event queue:空】
setTimeout作为宏任务放入宏任务event queue中,记为setTimeout1。
【输出:1】
【宏任务event queue:setTimeout1】
【微任务event queue:空】
process.nextTick作为微任务放入微任务event queue中。
【输出:1】
【宏任务event queue:setTimeout1】
【微任务event queue:nextTick1】
此时整体脚本的宏任务还未执行完,继续执行。Promise输出7,then作为微任务放入微任务event queue中,记为then1。
【输出:1,7】
【宏任务event queue:setTimeout1】
【微任务event queue:nextTick1,then1】
setTimeout作为宏任务放入宏任务event queue中,记为setTimeout2。
【输出:1,7】
【宏任务event queue:setTimeout1,setTimeout2】
【微任务event queue:nextTick1,then1】
此时整体脚本的宏任务执行结束,有微任务,执行微任务nextTick1和then1,输出6,8。
【输出:1,7,6,8】
【宏任务event queue:setTimeout1,setTimeout2】
【微任务event queue:空】
第二轮:
此时没有微任务,执行宏任务setTimeout1。setTimeout1输出2,process.nextTick作为微任务放入微任务event queue中,记为nextTick2,Promise输出4,回调函数then作为微任务放入微任务event queue中,记为then2。
【输出:1,7,