You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术问询:未赋值Promise及其关联处理函数的存储位置

未被赋值的Promise及其关联处理函数存储在何处?

咱们结合你给出的代码来拆解这个问题:

new Promise(executor).then(onFulfilment);
function executor (resolve, reject) {
  function runOnTimerCompletion(){
    resolve("Timer complete")
  }
  setTimeout(runOnTimerCompletion, 1000);
}
function onFulfilment(input){
  console.log(input)
  return input
}

首先要明确:这些没被你赋值给变量的Promise对象,并没有凭空消失,而是由JavaScript引擎在内部通过引用链和内部队列维护着,直到它们的生命周期彻底结束,才会被垃圾回收器清理。

1. 原始Promise(originalpromise)的存储

你调用new Promise(executor)创建的这个pending状态的Promise,虽然没被赋值给变量,但它被两个关键引用“抓”住了:

  • 首先,executor函数里的resolve方法是和这个原始Promise绑定的——引擎内部让resolve持有指向原始Promise的引用。而setTimeout的回调runOnTimerCompletion又引用了resolve,只要这个定时器回调还没执行,原始Promise就不会被回收。
  • 其次,当你调用.then(onFulfilment)时,引擎会把onFulfilment这个回调函数添加到原始Promise内部维护的fulfillment回调队列里(这个队列是Promise对象的内部属性,咱们开发者没法直接访问,但引擎会管好它)。

2. .then()返回的新Promise的存储

.then()方法一定会返回一个全新的Promise,哪怕你没把它赋值给变量。这个新Promise会被引擎内部和原始Promise关联起来:

  • 当原始Promise的状态变为fulfilled时,引擎会触发onFulfilment,而onFulfilment的返回值会用来resolve这个新Promise。
  • 引擎会暂时保留这个新Promise,直到它的状态也处理完成(比如onFulfilment执行完毕,新Promise变为fulfilled),并且没有任何其他活跃的引用指向它,才会标记它为可回收。

具体到你的代码流程

  1. 代码执行时,创建原始Promise,状态pending,值undefined;同时调用.then(),把onFulfilment加入原始Promise的回调队列,生成新Promise。
  2. setTimeout的回调被放入宏任务队列,等待1秒后执行。
  3. 1秒后,runOnTimerCompletion执行,调用resolve,原始Promise状态变为fulfilled,值为"Timer complete"。
  4. 引擎把onFulfilment从原始Promise的回调队列取出,放入微任务队列。
  5. 主线程空闲时,执行onFulfilment,打印内容并返回值,这个返回值用来resolve那个未被赋值的新Promise。
  6. 当所有这些流程完成后,原始Promise和新Promise都没有任何活跃引用了,垃圾回收器就会把它们从内存中清除。

简单来说:这些未被赋值的Promise和关联回调,都被JavaScript引擎在内存里“看管”着,直到它们完成了自己的使命(状态变更、回调执行),才会被清理掉。

内容的提问来源于stack exchange,提问作者javascriptttt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:11:44