一、介绍javaScript是一种单线程非阻塞脚本语言。单线程单线程是指在执行JavaScript代码时,主线程依次执行。非阻塞非阻塞是指在执行异步任务时,主线程会挂起任务,等待异步任务返回结果,然后依次执行事件循环同步任务:对于立即执行的任务,同步任务一般会直接进入主线程执行异步任务。任务:异步执行的任务。异步任务分为微任务和宏任务。同步任务进入主线程,即主执行栈。异步任务进入任务队列。主线程中的任务执行完后,会空到任务队列中读取对应的任务,推入主线程中执行。以上过程的不断重复就是事件循环2.宏任务和微任务异步任务分为微任务(microtask)和宏任务(macrotack)。微任务是在当前宏任务执行后立即执行的任务。下一个宏任务。常见的微任务:Promise.thenObject.observeMutationObserverprocess.nextTick(ndoe环境)宏任务每次执行栈执行的任务都是宏任务(包括从任务队列中获取下一个宏任务队列执行)。常见宏任务:脚本代码setTimeoutsetIntervalI/OUI交互事件postMessage3.代码分析示例代码'async1end')return'asyncthen'}asyncfunctionasync2(){console.log('async2end')}async1()setTimeout(function(){console.log('setTimeout')},0)async1().then(function(message){console.log(message)})newPromise(resolve=>{console.log('Promise')resolve()}).then(function(){console.log('promise1')}).then(function(){console.log('promise2')})console.log('scriptend')处理步骤1.遇到console直接打印'scriptstart'2.执行async1,打印console('async1start'),遇到async2后面的await阻塞进程。3、执行async2,打印'async2end',把async2后面的代码留着以后执行(任务队列:async1)4、遇到一个定时器,属于新的宏任务,留着以后执行(任务队列:async1,timer)5.执行async1,打印出'async1start','async2end',6..then属于microtask,放入microtask队列,稍后再执行(任务队列:async1,then,timer)7、遇到newPromise,这个直接执行,打印'Promise'8,.then是一个microtask,放入microtask队列,后面执行(任务队列:async1,then(async1),then(promise),定时器)9。遇到控制台直接打印'scriptend'执行任务队列宏task(async1,then,then,timer)1.执行async2之后的代码,打印'async1end'2.执行async1和async2之后的代码,并打印'async1end',然后放入微任务队列3,执行promise第一个then事件,打印'promise1',第二个then放入微任务队列4,执行微任务队列async1then事件,打印'asyncthen'5、执行Promisesecondthenevent,打印'promise2'6、最后执行定时器'setTimeout'输出:'scriptstart''async1start''async2end''async1start''async2end''Promise''scriptend''async1end''async1end''promise1''asyncthen''promise2''setTimeout'4.参考资料https://github.com/febobo/web...
