Javascript 闭包如何访问自毁变量?

Javascript 闭包如何访问自毁变量?,javascript,oop,closures,Javascript,Oop,Closures,当我学习创建对象的方法时,我发现了持久的构造函数模式,它依赖于闭包和创建私有变量的方法 例如: function Person(name, age, job){ var o = new Object(); o.sayName = function(){ alert(name); }; return o; } var m = new Person('joe',20, 'anything'); m.sayName(); // 'joe' name是只能由

当我学习创建对象的方法时,我发现了持久的构造函数模式,它依赖于闭包和创建私有变量的方法

例如:

function Person(name, age, job){
    var o = new Object();

    o.sayName = function(){
    alert(name);
    };

    return o;
}
var m = new Person('joe',20, 'anything');
m.sayName(); // 'joe'
name
是只能由
m.sayName
访问的私有变量

我还知道,当函数完成执行时,垃圾收集器会进行内存扫描,以便释放所有局部变量


因此,我的问题是,在构造函数完成执行后,当其内存被释放时,
m.sayName
如何访问
name

否,垃圾收集器只清理未引用的变量

闭包将
sayName
函数中的引用添加到
Person
的执行上下文中,该上下文是引用
name
的范围

只要引用了
sayName
,此引用就会保持活动状态。在释放
m
(或直接释放
m.sayName
)之前,变量不会被丢弃

闭包必须被视为从函数到创建它的作用域的引用(这也是为什么闭包经常被指出是JavaScript中内存泄漏的常见原因之一)。此引用使得可以从内部函数访问创建范围的变量(它们不是副本,这意味着两个内部函数共享相同的变量)

对闭包范围的引用在代码中是隐藏的,但是您可以通过开发人员工具看到它。下面是我在Chrome中执行
console.dir(m)
时看到的内容:


这意味着
sayName
间接引用了
name
?@OmarElawady是的。它对包含
name
的作用域有一个隐藏引用。因此,只需在函数中附加一个变量名就可以创建对它的引用?是的。但是,一旦您取消引用该函数,变量也将被释放。