我正在阅读this关于JavaScript中的事件循环和微/宏任务队列的博客,但我对博客中的陈述有疑问:
在 JavaScript 中,在事件发生之前不允许执行任何代码。值得一提的是,JavaScript 代码的执行本身就是一个宏任务。
宏任务包括解析 HTML、生成 DOM、执行主线程 JavaScript 代码以及其他事件,例如页面加载、输入、网络事件、定时器事件等。示例:setTimeout、setInterval、setImmediate、requestAnimationFrame、I/O ,UI渲染。
我所知道的是,JavaScript 代码的执行不能是宏任务,除非它是用户交互,如单击、setTimeout 等。
我不明白这一点,因为我只知道宏任务和微任务通常是异步操作,而主线程 JavaScript 代码的执行是同步代码,如
console.log("hello")
。如果我错了,请纠正我。
顺便说一句,我指的是浏览器环境中前端开发上下文中主线程 JavaScript 代码的执行。
宏任务包括解析 HTML、生成 DOM、执行 main 线程 JavaScript 代码以及其他事件,例如页面加载、输入、 网络事件、定时器事件等。示例:setTimeout、setInterval、 setImmediate、requestAnimationFrame、I/O、UI 渲染。
这是不准确的。宏任务队列仅包含 javascript 回调。
例如,如果您调用
setTimeout
,则回调仅在 setTimeout
完成时添加到宏任务队列中。 setTimeout
本身并不是一个宏任务。这是 javascript 回调,而不是调用本身,这是宏任务。
同样,当网络I/O完成时,javascript回调函数将被放入宏任务队列中。但网络 I/O 本身并不是一个宏任务。
我所知道的是,javascript代码的执行不能 宏任务,除非是用户交互,例如单击、setTimeout 等。
事件发生时,DOM 元素事件监听器回调被放置在宏任务队列中。这同样适用于来自
setTimeout
、fetch
等的回调
宏任务和微任务通常是异步操作, 主线程javascript代码的执行是同步代码
所有 JavaScript 执行都是单线程的(除非您有多个 Web Worker)。
Javascript 单线程执行微任务和宏任务队列中的任何内容,直到这些队列为空,然后等待添加新任务。
因此,网页加载时运行的初始 Javascript 代码本身就是一个宏任务,这是有道理的。