jm-jsjkxyjs02-zlm-405
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景:
(1) 暂存更改时需要提交信息;
(2) 审查 diff 时希望获得结构化摘要;
(3) 编写 PR 描述或变更日志(changelog)条目;
(4) 用户明确要求“为本次更改编写提交信息”。
该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
下载
标签中的整体代码块是第一个宏任务,浏览器解析时将其作为初始宏任务入队;执行完该宏任务后立即清空微任务队列,再取下一个宏任务。

<script> 整体代码块在事件循环中被当作**第一个宏任务**执行。
<p>它不是微任务,也不是“同步代码”之外的独立类别,而是整个脚本从上到下加载、解析、执行的过程,被事件循环视为一个初始的、完整的宏任务。<p>H3 宏任务队列的起点 <ul><li>浏览器加载页面时,遇到 <code><script> 标签,会立即将其中全部内容(包括同步语句、函数声明、<code>setTimeout、<code>Promise 构造等)作为单个宏任务推入宏任务队列。 <li>这个宏任务一旦开始执行,就按顺序跑完所有同步代码;过程中遇到异步操作,才把对应回调分别塞进宏任务队列(如 <code>setTimeout)或微任务队列(如 <code>Promise.then)。 <li>它是整个事件循环的起点,没有它,后续的宏/微任务都不会触发。<p>H3 为什么不算同步任务也不算普通异步任务 <ul><li>同步任务是宏任务内部的执行单元,比如 <code>console.log('a') 或 <code>let x = 1,它们不进队列,直接执行。 <li><code>script 本身不是“同步片段”,而是一个有明确边界和调度时机的任务单元:它必须排队、被选中、入栈、执行、出栈——完全符合宏任务的行为特征。 <li>它和 <code>setTimeout 回调一样,都由事件循环统一调度,只是优先级最高(排在队首)。<p>H3 实际执行顺序的关键逻辑 <ul><li>执行 <code>script 宏任务时,所有同步代码立即运行; <li>遇到 <code>Promise.resolve().then(...),<code>.then 回调被放入微任务队列; <li>遇到 <code>setTimeout(..., 0),回调被放入宏任务队列(排在当前 <code>script 之后); <li>当前 <code>script 宏任务执行完毕 → 立即清空微任务队列(所有已排队的 <code>.then 按序执行)→ 再取下一个宏任务(如 <code>setTimeout 回调)。<p>H3 常见误解澄清 <ul><li>❌ “<code>script 是同步的,所以不算任务” → 错。同步性描述执行方式,任务类型描述调度机制;它同步执行,但仍是被调度的宏任务。 <li>❌ “<code>script 和 <code>setTimeout 是同一类宏任务,可以互换顺序” → 错。<code>script 是首个且唯一自动入队的宏任务,其他宏任务需显式触发(如定时器到期、用户点击)。 <li>✅ 正确理解:<code><script> 是事件循环的入口任务,地位特殊,但归类清晰——它是宏任务,且是第一个。<p>font 事件循环不会跳过它,也不会把它降级。理解这一点,是看懂 JS 异步执行顺序的基础。</script>