技术问询:未赋值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),并且没有任何其他活跃的引用指向它,才会标记它为可回收。
具体到你的代码流程
- 代码执行时,创建原始Promise,状态pending,值undefined;同时调用
.then(),把onFulfilment加入原始Promise的回调队列,生成新Promise。 setTimeout的回调被放入宏任务队列,等待1秒后执行。- 1秒后,
runOnTimerCompletion执行,调用resolve,原始Promise状态变为fulfilled,值为"Timer complete"。 - 引擎把
onFulfilment从原始Promise的回调队列取出,放入微任务队列。 - 主线程空闲时,执行
onFulfilment,打印内容并返回值,这个返回值用来resolve那个未被赋值的新Promise。 - 当所有这些流程完成后,原始Promise和新Promise都没有任何活跃引用了,垃圾回收器就会把它们从内存中清除。
简单来说:这些未被赋值的Promise和关联回调,都被JavaScript引擎在内存里“看管”着,直到它们完成了自己的使命(状态变更、回调执行),才会被清理掉。
内容的提问来源于stack exchange,提问作者javascriptttt
相关产品推荐
相关产品推荐

