1.单线程模型指的是,JavaScript 只在一个线程上运行。也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待。
2.JavaScript 引擎有多个线程,单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。
3.同步任务是那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。
4.异步任务是那些被引擎放在一边,不进入主线程、而进入任务队列的任务。
- 只有引擎认为某个异步任务可以执行了(比如 Ajax 操作从服务器得到了结果),该任务(采用回调函数的形式)才会进入主线程执行。
- 如果是同步任务,主线程就等着 Ajax 操作返回结果,再往下执行;
- 如果是异步任务,主线程在发出 Ajax 请求以后,就直接往下执行,等到 Ajax 操作有了结果,主线程再执行对应的回调函数。
5.JavaScript 运行时,除了一个正在运行的主线程,引擎还提供任务队列(task queue),里面是各种需要当前程序处理的异步任务。
6.首先,主线程会去执行所有的同步任务。等到同步任务全部执行完,就会去看任务队列里面的异步任务。
- 如果满足条件,那么异步任务就重新进入主线程开始执行,这时它就变成同步任务了。等到执行完,下一个异步任务再进入主线程开始执行。一旦任务队列清空,程序就结束执行。
7.异步任务的写法通常是回调函数。一旦异步任务重新进入主线程,就会执行对应的回调函数。
- 如果一个异步任务没有回调函数,就不会进入任务队列,也就是说,不会重新进入主线程,因为没有用回调函数指定下一步的操作。
8.事件循环(Event Loop):引擎不停地检查,只要同步任务执行完了,引擎就会去检查那些挂起来的异步任务,是不是可以进入主线程了。
9.串行执行,一个任务完成以后,再执行另一个。并行执行,所有异步任务同时执行,等到全部完成以后,才执行final
函数。
- 并行与串行的结合,就是设置一个门槛,每次最多只能并行执行
n
个异步任务,这样就避免了过分占用系统资源。