一、重要理论
1、JavaScript是单线程语言,所有任务都是同步执行的。但是可以通过同步的方法实现异步执行。
2、Event loop(事件循环)是JS的执行机制,也是JS实现异步执行的一种方法。
3、JS的执行和运行的区别
JS可以在不同的环境中执行,比如浏览器、node等,但是不同的环境执行方式是不同的。
但是不管在那种环境下JS运行是统一的,运行是指JS的解析引擎。
二、JS的执行机制
1、同步任务、异步任务
按照JS是单线程语言的特点,JS执行机制应该是所有的执行任务都要排队依次等待执行。但这样的速度肯定会很慢,这样就有了同步任务和异步任务之分
如上图,当JS开始执行后,所有的同步任务进入主线程依次排队执行,异步任务则被送入Event Table中注册函数,当指定的事件完成后由被送入Event Queue中等待主线程执行栈的同步任务执行完后调取异步任务的函数执行。
如上图代码,setTimeout是异步任务,console.log()是同步任务,所以先执行console.log(),setTimeout则被送入Event Table中等待定时3s后注册函数,再被送入Event Queue中进入主程序执行栈中执行。
2、宏任务、微任务
macro-task(宏任务): 整体JS代码、setTimeout、setInterval
micro-task(微任务):Promise、process.nextTick
事件循环(Event loop)宏任务和微任务都有自己的Event Queue,各自进入自己的Event Queue中等待执行。上图是事件循环的整体示意图。当一段代码载入内存中开始执行后,整体代码作为第一个宏任务开始执行,如果有微任务的话送入对应的Event Queue中,宏任务执行完毕后再执行微任务,之后接着执行宏任务,就这样循环依次执行,称之为事件循环(JS的执行机制)。
网友评论