JavaScript 是单线程语言,决定于它的设计最初是用来处理浏览器网页的交互。浏览器负责解释和执行 JavaScript 的线程只有一个(所有说是单线程),即JS引擎线程,但是浏览器同样提供其他线程,如:事件触发线程、定时器触发线程等。
异步一般是指:
网络请求
计时器
DOM事件监听
事件循环机制:
JS引擎线程会维护一个执行栈,同步代码会依次加入到执行栈中依次执行并出栈。
JS引擎线程遇到异步函数,会将异步函数交给相应的Webapi,而继续执行后面的任务。
Webapi会在条件满足的时候,将异步对应的回调加入到消息队列中,等待执行。
执行栈为空时,JS引擎线程会去取消息队列中的回调函数(如果有的话),并加入到执行栈中执行。
完成后出栈,执行栈再次为空,重复上面的操作,这就是事件循环(event loop)机制。
参考:
Tasks, microtasks, queues and schedules
great talk at JSConf on the event loop
从浏览器多进程到JS单线程,JS运行... - 掘金
浏览器篇-Event-Loop.md - PDKSophia/blog.io