当前位置: 首页 > wzjs >正文

江西营销网站建设秋莱网站建设

江西营销网站建设,秋莱网站建设,外贸怎么做起来,网站建设方案可行性JavaScript 事件循环机制(Event Loop)详解 JavaScript 是 单线程、非阻塞 语言,依赖 事件循环(Event Loop) 来实现异步编程。它的执行模型包括 调用栈(Call Stack)、任务队列(Task …

JavaScript 事件循环机制(Event Loop)详解

JavaScript 是 单线程、非阻塞 语言,依赖 事件循环(Event Loop) 来实现异步编程。它的执行模型包括 调用栈(Call Stack)、任务队列(Task Queue)和微任务队列(Microtask Queue)


1. 事件循环(Event Loop)基本流程

事件循环的核心工作方式:

  1. 同步任务(Synchronous) 进入 调用栈 依次执行。
  2. 遇到 异步任务(如 setTimeout、Promise、I/O 操作),交给 Web API(如浏览器、Node.js 运行时)处理,并继续执行同步代码。
  3. 同步代码执行完毕,调用栈清空,事件循环检查 微任务队列(Microtask Queue),依次执行所有微任务。
  4. 微任务执行完毕,进入 宏任务队列(Macro Task Queue),取出第一个任务执行。
  5. 重复以上步骤。

2. 任务类型:同步任务 vs 异步任务

JavaScript 任务分为:

(1) 同步任务(Synchronous)

  • 直接执行,放入 调用栈(Call Stack)
  • 例子:
    console.log('同步任务1'); // 立即执行
    

(2) 异步任务(Asynchronous)

  • 由 Web API 处理,待合适时机进入任务队列:
    • 宏任务(Macro Task)
    • 微任务(Micro Task)

3. 宏任务(Macro Task) vs 微任务(Micro Task)

任务类型常见API进入队列
宏任务(Macro Task)setTimeoutsetIntervalsetImmediate(Node.js)、I/OUI渲染任务队列(Task Queue)
微任务(Micro Task)Promise.then()queueMicrotask()MutationObserverprocess.nextTick()(Node.js)微任务队列(Microtask Queue)

4. 事件循环执行流程

console.log('同步任务1');setTimeout(() => {console.log('宏任务1');
}, 0);Promise.resolve().then(() => {console.log('微任务1');
});console.log('同步任务2');

执行顺序解析

  1. console.log('同步任务1') 执行(同步任务)
  2. setTimeout() 放入 宏任务队列,等待执行
  3. Promise.then() 放入 微任务队列
  4. console.log('同步任务2') 执行(同步任务)
  5. 调用栈清空,检查 微任务队列,执行 console.log('微任务1')
  6. 微任务清空后,执行 宏任务队列,输出 console.log('宏任务1')
最终输出顺序
同步任务1
同步任务2
微任务1
宏任务1

5. setTimeout(fn, 0) 为什么不立即执行?

  • setTimeout(fn, 0) 也会进入 宏任务队列,需要等当前同步任务执行完毕,并在 微任务全部执行完毕后,才能执行。
  • 示例
    setTimeout(() => console.log('宏任务'), 0);
    Promise.resolve().then(() => console.log('微任务'));
    console.log('同步任务');
    
    执行顺序
    同步任务
    微任务
    宏任务
    

6. PromisesetTimeout 谁先执行?

  • Promise.then() 是微任务,会先执行
  • setTimeout() 是宏任务,等微任务执行完才执行

示例

setTimeout(() => console.log('setTimeout'), 0);
Promise.resolve().then(() => console.log('Promise'));

执行顺序

Promise
setTimeout

7. 事件循环完整示例

console.log('start');setTimeout(() => {console.log('setTimeout');
}, 0);Promise.resolve().then(() => {console.log('Promise1');
}).then(() => {console.log('Promise2');
});console.log('end');

执行顺序

  1. console.log('start')(同步任务)
  2. setTimeout() 进入 宏任务队列
  3. Promise.then() 进入 微任务队列
  4. console.log('end')(同步任务)
  5. 同步任务结束,执行微任务
    • Promise1
    • Promise2
  6. 微任务执行完毕,执行宏任务
    • setTimeout

最终输出:

start
end
Promise1
Promise2
setTimeout

8. async/await 也是微任务

示例

async function asyncFunc() {console.log('A');await Promise.resolve();console.log('B');
}console.log('C');
asyncFunc();
console.log('D');

执行顺序

C
A
D
B

解释

  1. console.log('C')(同步任务)
  2. 调用 asyncFunc(),输出 A
  3. await Promise.resolve()console.log('B') 进入 微任务队列
  4. console.log('D')(同步任务)
  5. 执行微任务
    • console.log('B')

9. setTimeout()setImmediate()(Node.js)

Node.js 中:

  • setTimeout(fn, 0) 进入 定时器队列
  • setImmediate(fn) 进入 Check 队列
  • setImmediate() 通常比 setTimeout(0) 先执行

示例

setTimeout(() => console.log('setTimeout'), 0);
setImmediate(() => console.log('setImmediate'));

输出顺序(Node.js)

setImmediate
setTimeout

10. 关键点总结

概念说明
同步任务立即执行,进入 调用栈
异步任务由 Web API 处理,稍后执行
宏任务(Macro Task)setTimeoutsetIntervalsetImmediateI/O
微任务(Micro Task)Promise.then()queueMicrotask()MutationObserver
事件循环(Event Loop)先执行同步任务 → 再执行微任务 → 再执行宏任务

11. 最佳实践

避免阻塞主线程

  • 使用 setTimeout(fn, 0)requestIdleCallback(fn) 处理密集计算

优先使用微任务优化异步流程

  • Promise.then()setTimeout() 先执行

了解 async/await 也是微任务

  • await 后的代码会在微任务队列中执行

总结

  1. JavaScript 是单线程,使用事件循环管理异步任务
  2. 任务分为
    • 同步任务(调用栈直接执行)
    • 异步任务(进入宏任务/微任务队列)
  3. 执行顺序
    • 先执行同步任务
    • 再执行所有微任务
    • 最后执行宏任务
  4. Promise.then()setTimeout() 先执行
  5. async/await 本质上是 Promise,属于微任务

这些概念对于理解 JavaScript 的异步执行至关重要!🚀

http://www.dtcms.com/wzjs/792311.html

相关文章:

  • 做网站衡水度更新网站
  • 专业柳州网站建设哪家便宜兰州做网站的公司有哪些
  • 铁盒 东莞网站建设英语培训
  • 卡二卡四无卡国产网站梦幻西游网页版最新版本
  • 地方网站推广网页设计素材图片免费
  • 公众号做电影网站合肥房产网备案查询
  • php 手机网站cms系统宁津网页设计
  • 凤岗建设网站上海vis设计
  • 俄语网站推广施工企业信用综合评价系统
  • 网站文章发布时间湛江房产网
  • 在线名片制作网站开发做淘宝优惠卷网站步骤
  • 杰讯山西网站建设网站备案域名购买
  • 网站带数据库下载上海今天最新新闻10条
  • 东莞家政网站建设网页设计师工作职责
  • 平台网站开发方案单位做核酸检测的通知
  • 想兼职做网站推广泉州建设网站
  • 网站做美食视频挣钱吗新建网站怎么保存
  • 网站建设策划ppt网站的设计方法有哪些内容
  • 紫金公司网站制作响水县住房和城乡建设局网站
  • 什么网站可以找到防水工程做背投广告典型网站
  • 专门做商标的网站有哪些中山网站建设文化信息
  • 免费情感网站哪个好天津建筑信息网
  • p2p的网站建设设计师建站网站
  • 网站建设先有域名然后呢荆州网络推广
  • 宁波网站建设地址网站怎么百度收录
  • 网站建设及推广费用怎么入账如何做360网站优化
  • 网站定制 天津道路建设去什么网站能看到
  • 木渎建设局网站网页编辑软件绿色
  • wordpress php转html代码宁波seo推广哪家好
  • 网站建设开发费入什么科目什么是在线设计平台