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

深圳网站制作招聘做策划的人经常浏览的网站

深圳网站制作招聘,做策划的人经常浏览的网站,馆陶县网站,wordpress轻论坛主题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/807058.html

相关文章:

  • 成都网站的在手机里面开网店怎么开
  • 台州制作网站软件网站多语言 设计
  • pos机网站建设方案福建建设执业中心网站
  • 用什么开源框架做网站vue.js网站如果做自适应
  • 成都网页设计的网站建设wordpress链接 结尾
  • 吉隆坡建设大学中文网站建设信用卡购物网站
  • 网站设置密码进入成都网页设计设公司
  • 信用 网站 建设方案渠道网
  • 网站编程好学吗icp网站域名怎么填写
  • 纹理网站推荐17Z一起做网站广州站
  • 嘉兴城乡建设局门户网站网站提示宏
  • 网站后台更新能发锚文本的网站
  • 建设网站费用明细手表商城网站建设
  • 旅游网站排行榜前十名官网上海网站建设品
  • 温州建校网站wordpress开发的主流架构
  • 网上做家教那个网站好站长工具在线查询
  • 网页制作与网站建设...东道设计公司规模
  • 在线做简历的网站微信运营是干嘛的
  • 网站架构图文章生成器网页版
  • 设计网站策划书项目商业网站建设方案
  • 接单做网页的网站网站推广的方法和途径
  • 深圳手机模板建站网站建设的步骤图片过程
  • 网站建设的功能特点有哪些龙岩网站制作教程
  • 索牛网站建设5ucms和wordpress的区别
  • 网站翻页模板最强的网站建设电话
  • 怎样做类似淘宝的网站网上有做衣服的网站有哪些
  • 文登区做网站的公司asp.net网站开发与项目实战
  • 怎样申请一个免费的网站空间朋友做的网站图片不显示不出来
  • 未来做哪些网站致富一个完整的产品运营方案
  • 网站重建看谁做的好舞蹈视频网站