javascript是单线程脚本语言。HTML5引入了webworker标准,允许创建多个子线程,但子线程完全受主线程控制,不能操作DOM。浏览器EventLoop机制所有的同步任务都在主线程上执行,形成一个执行栈在主线程外还有一个任务队列,只要异步任务有运行结果,就会在任务队列中放入一个事件去执行执行栈中的所有同步任务都完成了,系统会去读取任务队列,看看有哪些任务。那些对应的异步任务结束等待状态,进入执行栈,开始执行主线程,重复以上三个步骤。节点EventLoop机制V8引擎解析JavaScript脚本。解析后的代码调用节点API。libuv库负责节点API的执行。它将不同的任务分配给不同的线程,形成一个EventLoop,将执行结果以异步的方式返回给V8引擎。V8引擎将结果返回给用户。扩展异步任务。异步任务可以分为宏任务和微任务。在任务队列中,微任务最先执行。,执行完微任务后执行宏任务。每次执行宏任务时,系统都会先检查是否有微任务可以执行。宏任务列表I/OsetTimeoutsetIntervalrequestAnimationFrame(browser)setImmediate(node)microtasklistpromisethen/catch/finallyasync/awaitMutationObserver(browser)process.nextTick(node)*process.nextTick是当前执行栈的尾部,下一个EventLoop读取的任务队列前触发回调函数*setImmediate为当前任务队列的尾部,每次EventLoop读取任务队列时触发回调函数示例console.log('starttask')setTimeout(()=>{console.log('setTimeout1')process.nextTick(()=>{console.log('nextTickinsetTimeout')})},0)setImmediate(()=>{console.log('setImmediate1')setTimeout(()=>{console.log('setTimeoutinsetImmediate1')},0)setImmediate(()=>{console.log('setImmediate2')})setTimeout(()=>{console.log('setImmediate中的setTimeout2')},0)})process.nextTick(()=>{console.log('nextTick1')process.nextTick(()=>{console.log('nextTick2')})})newPromise(()=>{console.log('promise')constchain=Promise.resolve()chain.then(()=>{console.log('chain1')})chain.then(()=>{console.log('chain2')})})console.log('endtask')//执行结果://开始task//promise//结束任务//nextTick1//nextTick2//chain1//chain2//setTimeout1//nextTickinsetTimeout//setImmediate1//setImmediate2//setTimeoutinsetImmediate1//setTimeoutinsetImmediate2/***提示!*setImmediate和setTimeout的执行顺序是随机的,只有嵌套setImmediate时,才固定先执行setImmediate*/参考:http://www.ruanyifeng.com/blo...
