js都是靠事件驱动的, js中的事件循环机制是什么呢?异步
只是简单写一下本身的理解, 因此不是很全面;测试
js 程序执行有 主队列 以及 异步队列两种方式ui
栈中是按照顺序进行执行, 对于一段代码的解释, 按照不一样的类型进行解释,
入栈, 而后按照栈的顺序(后进先出)依次进行执行线程
主队列, 即从上到下的方式依次进行执行code
异步队列主要包括macroTask 和 macroTask队列
macroTask, 主要包括 setTimeout setInterval IO UIRendering(只列举经常使用的)事件
microTask , 主要包括 Promise processio
主线程执行完成后, 会首先查看 microTask 队列中是否有, 执行完成后, 再执行 macroTaskconsole
例如以下个人测试代码function
console.log("1") setTimeout(function () { console.log("2") }) Promise.resolve().then(function () { console.log("3") setTimeout(function () { console.log("31") setTimeout(function () { console.log("311") }) Promise.resolve().then(function () { console.log("3111") }) }) }).then(function () { console.log("4") }) setTimeout(function () { console.log("5") Promise.resolve().then(function () { console.log("51") }) }) console.log("11") //输出以下: 1 11 3 4 2 5 51 31 3111 311 //macro [2, 5] [31] //micro [3, 4] [51]
须要注意的地方:
microTask会阻碍页面的 render, render 是属于 macroTask;
因此若是有 microTask 一直循环执行的话, 会阻碍 ui 的 render;
可是 setTimeout 不会;
另外要注意 rAF(requestAnimationFrame) 的使用, 这个是用来专门进行渲染使用的, 执行速度会 比 setTimeout 少不少.