主线程javascript代码的执行是宏任务吗?

问题描述 投票:0回答:1

我正在阅读this关于JavaScript中的事件循环和微/宏任务队列的博客,但我对博客中的陈述有疑问:

在 JavaScript 中,在事件发生之前不允许执行任何代码。值得一提的是,JavaScript 代码的执行本身就是一个宏任务

宏任务包括解析 HTML、生成 DOM、执行主线程 JavaScript 代码以及其他事件,例如页面加载、输入、网络事件、定时器事件等。示例:setTimeout、setInterval、setImmediate、requestAnimationFrame、I/O ,UI渲染。

我所知道的是,JavaScript 代码的执行不能是宏任务,除非它是用户交互,如单击、setTimeout 等。

我不明白这一点,因为我只知道宏任务和微任务通常是异步操作,而主线程 JavaScript 代码的执行是同步代码,如

console.log("hello")
。如果我错了,请纠正我。 顺便说一句,我指的是浏览器环境中前端开发上下文中主线程 JavaScript 代码的执行。

javascript event-loop task-queue
1个回答
-1
投票

宏任务包括解析 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 代码本身就是一个宏任务,这是有道理的。

© www.soinside.com 2019 - 2024. All rights reserved.