引用对象的方法是否会阻止该对象被JavaScript垃圾回收?
问题解答
你给出的示例代码存在类名、方法名的笔误,我们默认统一逻辑为:返回创建的Item类实例的print方法进行解答,核心结论如下:
你直接返回实例方法引用的场景,不会阻止临时创建的实例被垃圾回收,且你给出的第一个示例实际无法得到你预期的输出,原因如下:
- 首先澄清ES6类方法的存储逻辑:类中声明的普通非箭头函数方法,是挂载在类的
prototype原型对象上共享的,每个实例本身不会单独存储一份方法副本。当你执行(new Item(name)).print取值时,本质是沿着实例的原型链找到Item.prototype.print这个函数的引用,这个引用本身和你创建的临时实例没有绑定关系。 - 你示例中
printer()属于普通函数调用,默认this在严格模式下为undefined、非严格模式下指向全局对象,根本访问不到实例的name属性,不会打印出Alan,你假设的“ES6类方法会自动绑定到实例、存储this引用”的逻辑不成立。 - 如果你通过
bind手动绑定实例再返回,比如以下写法:
function namePrinter(name) { const ins = new Item(name) return ins.print.bind(ins) }
这种场景下bind返回的新函数会内部持有绑定的ins实例引用,此时实例会被保留不会被GC,直到printer变量被销毁、引用解除。
你旁注给出的闭包实现逻辑是成立的:返回的箭头函数捕获了作用域内的item实例引用,只要返回的函数还存在,实例就不会被GC。
内容的提问来源于stack exchange,提问作者agd1
相关产品推荐
相关产品推荐

