javascript是一个单线程语言,javascript分为同步机制及异步机制,其中同步机制是放在栈中,而异步机制是放在队列中,等到栈中的任务执行完后在去执行队列里面的任务。
javascript有一个main thread(主线程)和call-stack(调用栈),当在是call-stack中的任务时,遇到类似于settimeout这种异步的api后,会交由浏览器其它模块处理,然后异步时间到后,把异步需要处理的task放到队列中,当调用栈中的任务执行完后在去执行队列里面的task
举个例子
console.log('1')
setTimeout(()=>{
console.log('2')
})
setTimeout(()=>{
console.log('3')
})
console.log('4')
根据执行上下文开始进入到调用栈,首先遇到console.log('1')
,然后在调用栈中执行改代码
当执行遇到setTimeout时,由于是异步函数,会把该异步task交由timer模块处理,当timer模块处理完后,把对应的函数放到task queue中等待
注意:
call-stack把异步任务交由timer模块后立马执行新的上下文代码
当call-stack中的任务执行完成后,然后就去执行task queue里面的任务
所以页面最终的输出顺序为
console.log('1')
console.log('4')
console.log('2')
console.log('3')