promise、setTimeout混搭的 JavaScript 运行机制

本文深入探讨了Promise和setTimeout在JavaScript中的运行机制,包括Promise的状态转换、宏任务和微任务的区别以及它们在事件循环中的执行顺序。通过实例分析了代码执行的流程,帮助理解异步操作在JavaScript中的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

promise、setTimeout混搭的 JavaScript 运行机制

笔试题总考,一次又一次再见面的兄弟 promise 和 setTimeout真让人欲罢不能(雾)。真的受不了每次浑水摸鱼猜(真实),这次看了各有趣的总结,在此做个总结!!

参考: https://juejin.im/post/59e85eebf265da430d571f89#heading-3

首先先要知道 promise 是个啥玩意(喂,难道没有弄清楚就冲了吗?)

Promise 对象是一个构造函数。
  1. resolve 和 reject 是两个函数,JavaScript 引擎提供,不需要自己部署。
  2. 在 promise 函数内,这两个函数是用来改变 promise 的状态。状态只要改变就不受外界影响再改变。(超级奈斯有没有 QvQ )
  3. 比如:在异步调用成功之后,需要将 promise 状态改为 fulfilled,就要用 resolve(), 如果是异步调用失败之后嫩,就需要将 promise 状态改为 rejected,就需要调用 reject()
const isCheck = true;
const pro1 = function(tem) {
   
  const message = "hey gay!" + tem.height + " " + tem.color;
  return Promise.resolve(message);
};

const pro2 = new Promise((resolve,reject) => {
   
  if (isCheck) {
   
    const tem = {
   
      height: '111',
      color: 'red'
    };
    console.log("pro2.resolve");
    return resolve
### JavaScript 运行机制 JavaScript 是一种解释型语言,其运行机制涉及多个关键组件,包括解释引擎、事件循环以及任务队列等。以下是关于 JavaScript 运行机制的详细说明: #### 1. 解释引擎 JavaScript 的解释引擎负责解析和执行代码。现代浏览器通常使用高性能的 JavaScript 引擎,例如 Chrome 的 V8 引擎[^1]。这些引擎通过以下方式处理代码: - **解释器(Interpreter)**:逐行读取代码并立即执行,适合快速启动。 - **编译器(Compiler)**:将整个代码一次性编译为优化后的字节码或机器码,提升运行效率。 - **即时编译(JIT - Just-In-Time Compilation)**:结合解释器和编译器的优点,先以解释器快速启动,再通过编译器优化热点代码。 JavaScript 引擎在代码执行时会将其转换为机器语言。这个过程可以由解释器逐行转换,也可以由编译器一次性完成[^2]。 #### 2. 单线程模型 JavaScript 在浏览器中运行时采用单线程模型,这意味着同一时间只有一个任务能够被执行。这种设计避免了多线程环境下的复杂性,但也带来了性能上的挑战。为了应对异步操作,JavaScript 引入了事件循环机制。 #### 3. 事件循环(Event Loop) 事件循环是 JavaScript 处理异步任务的核心机制。它通过协调任务队列和调用栈来确保程序的流畅运行。事件循环的工作原理如下: - **调用栈(Call Stack)**:用于跟踪当前正在执行的函数。 - **任务队列(Task Queue)**:存储待执行的任务,分为微任务队列(Microtask Queue)和宏任务队列(Macrotask Queue)。 - **微任务**:如 `Promise.then()`,优先级高于宏任务。 - **宏任务**:如 `setTimeout()` 和 `setInterval()`,优先级较低。 - **事件循环线程**:当调用栈为空时,事件循环线程会从微任务队列中取出任务执行,然后再处理宏任务队列中的任务[^4]。 #### 4. GUI 线程 JS 引擎线程的互斥关系 在浏览器环境中,GUI 渲染线程和 JavaScript 引擎线程是互斥的。这意味着当 JavaScript 引擎正在执行代码时,GUI 渲染会被暂停;反之亦然。这种设计保证了界面的响应性和脚本的稳定性[^3]。 #### 5. 异步任务的处理 JavaScript 的异步任务通过事件循环机制得以实现。例如: - 当遇到 `setTimeout()` 或 `Promise` 时,相关任务会被放入任务队列中。 - 当调用栈为空时,事件循环线程会依次从微任务队列和宏任务队列中取出任务执行。 以下是一个简单的示例,展示事件循环如何处理同步和异步任务: ```javascript console.log("Task 1"); setTimeout(() => { console.log("Task 2"); }, 0); Promise.resolve().then(() => { console.log("Task 3"); }); console.log("Task 4"); ``` 输出结果为: ``` Task 1 Task 4 Task 3 Task 2 ``` 这是因为 `Promise.then()` 属于微任务,优先于宏任务 `setTimeout()` 被执行。 ### 结论 JavaScript运行机制基于单线程模型,通过解释引擎解析代码,并利用事件循环处理异步任务。这种设计既保证了代码的简单性,又提供了强大的异步能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值