Javascript 当您不再引用ES6承诺时,它会发生什么变化?

Javascript 当您不再引用ES6承诺时,它会发生什么变化?,javascript,garbage-collection,es6-promise,Javascript,Garbage Collection,Es6 Promise,背景 您可以从以下代码中看到: var foo1 = new Promise (function (resolve, reject){}; var foo2 = new Promise (function (resolve, reject) { resolve('succes!'); }); var foo3 = new Promise (function (resolve, reject) { reject(Error('Failure!')); }); consol

背景

您可以从以下代码中看到:

var foo1 = new Promise (function (resolve, reject){};

var foo2 = new Promise (function (resolve, reject) {

    resolve('succes!');
});

var foo3 = new Promise (function (resolve, reject) {

    reject(Error('Failure!'));
});

console.log (typeof foo1 === 'object'); // true
console.log (Object.getOwnPropertyNames(foo1)); // []
console.log (foo1.length); // undefined

console.log (foo1); // Promise { <pending> }
console.log (foo2); // Promise { 'succes!' }
console.log (foo3); // Promise { <rejected> [Error: Failure!] }
您不再能够访问此状态或结果

问题

在上述情况下,
是否承诺
会收集垃圾?如果不是,是否会产生导致内存泄漏的风险

是否承诺在上述情况下收集垃圾

对。承诺对象在这方面与其他对象一样


有些实现(Firefox)确实有特殊的行为,未经处理的拒绝检测依赖于垃圾收集,但这并不会真正改变正在收集的promise对象。

除了编写不好的代码会生成太多内容外,JS中几乎存在内存泄漏这样的情况。没有人再使用IE6/7了……谢谢你,@dandavis。仍然有兴趣找到答案,尽管“死”承诺有时可能包含敏感信息,也因为极客对了解JS的一切都感兴趣:)非常感谢,@Bergi。我不确定垃圾收集(GC)如何与传递给
Promise
构造函数的函数体相关。我自己的想法是:
承诺
只能解决一次,不能重复使用。因此,如果函数体在
Promise
结算后立即被GC'ed,那么这是有意义的-无论
Promise
实例是否被GC'ed。函数体是否被GC'ed,如果是,这是否独立于
Promise
实例的GC?是,promise实例不包含对传递给构造函数的executor函数的引用,它们对于GC来说是非常独立的。当然,这并不意味着不能有对executor函数的任何其他引用,例如,当您重用它们时,或者当异步操作关闭它时(就像它关闭
resolve
reject
)因此,无论
Promise
实例是否在同一时间被GC'ed,异步执行器函数在其解决之前都不会被GC'ed?不,您不能这样概括它。你需要考虑一个场景,然后分析一下。
foo1 = null;
foo2 = null;
foo3 = null;