JavaScript 是单线程的(single threaded)
单线程模型指的是,JavaScript 只在一个线程上运行。事实上,JavaScript 引擎有多个线程,但是单个脚本只能在一个线程上运行(称为主线程),其他线程都是在后台配合。
单线程模式的优点是实现起来比较简单,执行环境相对单纯;缺点是耗时长的任务会阻塞其后面任务的执行。为了解决这个缺点,JavaScript 中引入了异步任务。
同步任务和异步任务:
- 同步任务:那些没有被引擎挂起、在主线程上排队执行的任务。只有前一个任务执行完毕,才能执行后一个任务。同步任务会阻塞代码执行
- 异步任务:那些被引擎放在一边,不进入主线程、而进入任务队列的任务。当某个异步任务可以执行后,该任务进入主线程执行。异步任务不会阻塞代码执行
异步任务可以分为宏任务和微任务:
- 宏任务:由浏览器规定的,包括 setTimeout、setInterval、Ajax、DOM 事件等 Web APIs,回调函数放在 Main Task Queue 中
- 微任务:ES6 语法规定的,包括 Promise、async/await,回调函数放在 Microtask Queue 中
JavaScript 执行时的简易图: