js的事件循环

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'),然后在调用栈中执行改代码

image.png

当执行遇到setTimeout时,由于是异步函数,会把该异步task交由timer模块处理,当timer模块处理完后,把对应的函数放到task queue中等待
image.png

注意:call-stack把异步任务交由timer模块后立马执行新的上下文代码
image.png

image.png

当call-stack中的任务执行完成后,然后就去执行task queue里面的任务
所以页面最终的输出顺序为

console.log('1')
console.log('4')
console.log('2')
console.log('3')

你可能感兴趣的:(js的事件循环)