JavaScript 执行机制

JS 是一门单线程的脚本语言.

堆/栈/队列

堆 ( heap )

堆是指程序运行时申请的动态内存,在 JS 运行时用来存放对象.

栈 ( stack )

栈遵循的原则是先进后出, JS 的基本数据类型和指向对象的地址存放在栈内存中,此外还有一块栈内存用来指向 JS 主线程–执行栈( execution context stack ).

队列 ( queue )

队列遵循先进先出, JS 中除了主线程之外还存在一个任务队列.

怎样知道主进程执行栈为空呢?

JS 引擎存在 monitoring process 进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去任务队列 (Event Queue)那里检查是否有等待被调用的函数。

Event Loop

  • 同步和异步任务分别进入不同的执行”场所”,同步的进入主线程,异步的进入Event Table并注册函数。
  • 当指定的事情完成时,Event Table会将这个函数移入Event Queue
  • Event Loop在不同的运行环境下有着不同的方式。

微任务(micro-task)与宏任务(macro-task)

任务队列中任务是有区别的, 总是有一些任务会有一些特权(比如插队), 有特权的微任务, 和无特权的宏任务.
就是说, 实际任务队列有两个, 微任务队列/宏任务队列, 当主线程执行完毕, 如果微任务队列中有任务则优先执行, 当微任务队列没有任务时才执行宏任务队列.

微任务: 原生Promise(有些实现的promise将then方法放到了宏任务中),Object.observe(已废弃), MutationObserver, MessageChannel, process.nextTick, setImmediate

宏任务: setTimeout, setInterval, setImmediate, I/O


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!