javascript - 闭包如何访问被破坏的变量?

标签 javascript oop closures

当我学习创建对象的方法时,我发现了 Durable Constructor Pattern,它依赖于闭包和创建私有(private)变量的方法。

例如:

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是私有(private)变量,只能被m.sayName访问。

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

所以我的问题是,m.sayName 如何访问 name,而它的内存在构造函数执行完毕后已被释放。

最佳答案

不,垃圾收集器只清理未被引用的变量。

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

只要 sayName 被引用,这个引用就会一直存在。在您释放 m(或直接释放 m.sayName)之前,该变量不会被丢弃。

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

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

enter image description here

关于javascript - 闭包如何访问被破坏的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30016745/

相关文章:

javascript - 如何确定用户在 Meteor 中使用的登录类型?

javascript - 空输入类型文件在 IE 中不起作用

Python:无法从不同模块/函数访问类属性

oop - 书籍和标签的OO设计

objective-c - 如何在具有相同根类的两个类之间共享代码?

javascript - 如何将闭包与函数指针一起使用?

jquery - 在 $(document).ready() 函数内部生成闭包的目的是什么?

c# - 设置 RadioButtonList 的选定值无法按预期工作

ruby - 了解 Ruby 闭包

javascript - 在 Javascript 中将文件路径模型从 Linux (/) 更改为 Windows (\)