JavaScript 是一个单线程、非阻塞、异步、解释性的脚本语言。
- 单线程:有且只有一个调用栈、每次只能做一件事。
- 非阻塞:阻塞指的是顺序执行(即,遇到网络请求这样耗时的代码时,只能请求完后再执行其他操作),而对于网页而言,用户无法接受一旦有网络请求后就无法进行其他操作,所以 javascript 采用非阻塞。
- 异步:既然存在非阻塞,必然存在异步
EventLoop 就是为了防止主线程阻塞而出现的程序结构,它用于处理主线程和其他进程的通信。
一个 EventLoop 中,可以有一个或者多个任务队列,每个队列的运行机制为:
- 宏任务:执行栈内的代码为一个宏任务,诸如 整体代码、
setTimeout
,setInterval
,I/O
,DOM
,Ajax
等均可以开启一个执行栈; - 微任务:当前宏任务执行结束后开始执行当前轮的微任务,微任务包括:
Promise.then
,async/await
等。(注意,他们都是 ES6)。