You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Even though window.requestAnimationFrame(…) is a function of DOM object window, it’s callback is queued in a micro task queue but it’s execution strategy is different.
执行 & 运行
JavaScript 的执行和运行是两个不同概念的,执行,一般依赖于环境,比如 node、浏览器、Ringo 等, JavaScript 在不同环境下的执行机制可能并不相同。而 Event Loop 就是 JavaScript 的一种执行方式。所以下文我们还会梳理 node 的执行方式。而运行呢,是指JavaScript 的解析引擎。这是统一的。
JavaScript 有一个主线程 main thread,和调用栈 call-stack 也称之为执行栈。所有的任务都会放到调用栈中等待主线程来执行。
js引擎始终只有一个线程,它维护一个消息队列,当前函数栈执行完成之后就去不断地取消息队列中的消息(回调),取到了就执行。但是js引擎只负责取消息,不负责生产消息。
js运行时,就负责给js引擎线程发送消息。比如浏览器DOM事件发送一条鼠标点击的消息(浏览器子线程和js引擎线程的IPC通信),那么js引擎在执行完函数栈之后就会取到这条鼠标点击信息,执行消息(即回调);比如node运行时读取文件,执行系统调用,完成后发送读取文件完成的消息,之后的过程同上。js运行时只负责生产消息,不负责取消息。
单线程
JS 是单线程的,所以需要 Event Loop 来调度。JS 是通过事件队列 (EventLoop)的方式来实现异步回调的。
DOM API / 定时器 / http 请求这些 Web API都是浏览器提供的,帮助我们实现异步 / 非阻塞的行为 。
Event Loop
Event Loop 的工作就是连接任务队列和调用栈,当调用栈中的任务均执行完毕出栈,调用栈为空时,Event Loop 会检查任务队列中是否存在等待执行的任务,如果存在,则取出队列中第一个任务,放入调用栈。
宏任务和微任务
script(整体代码)
、setTimeout
、setInterval
、I/O
、setImmedidate(Node.js)
、requestAnimationFrame
queueMicrotask
、process.nextTick(Node.js)
、MutationObserver
、Promise.then /catch/finally
任务队列,是包括一个宏任务队列和一个微任务队列的。每次执行栈为空的时候,系统会优先处理微任务队列,处理完微任务队列里的所有任务,再去处理宏任务。
queueMicrotask
为什么需要这个 api?
Promise.resolve
会将异常转化为一个rejected
的 PromisePromise.resolve
会返回一个 Promise 实例对象,而直接queueMicrotask
则不会requestAnimationFrame(callback)
- RAFqueueMicrotask(callback)
- 微任务window.requestAnimationFrame(…)
Even though window.requestAnimationFrame(…) is a function of DOM object window, it’s callback is queued in a micro task queue but it’s execution strategy is different.
参考资料
The text was updated successfully, but these errors were encountered: