背景

JavaScript 采用的是单线程。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。多线程需要共享资源、且有可能修改彼此的运行结果,对于一种网页脚本语言来说,这就太复杂了。所以,为了避免复杂性,JavaScript 一开始就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

  • 好处

实现起来比较简单,执行环境相对单纯

  • 坏处

只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行

任务队列和事件循环

JavaScript 运行时,除了一个正在运行的主线程,引擎还提供一个任务队列(task queue),里面是各种需要当前程序处理的异步任务。主线程首先会去执行所有的同步任务,所有同步任务结束之后,就会去看任务队列里面的异步任务。如果满足条件,那么异步任务就重新进入主线程开始执行。

同步任务是那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。

异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务

  • 异步任务的写法通常是回调函数。一旦异步任务重新进入主线程,就会执行对应的回调函数。
  • JavaScript 引擎怎么知道异步任务有没有结果,能不能进入主线程呢?答案就是引擎在不停地检查,一遍又一遍,只要同步任务执行完了,引擎就会去检查那些挂起来的异步任务,是不是可以进入主线程了。这种循环检查的机制,就叫做事件循环(Event Loop)。

异步操作