2015-05-03 46 views
1

当我正在学习创建对象的方法时,我发现了持久构造函数模式,它依赖于闭包和创建私有变量的方式。闭包如何访问析构变量?

所以例如:

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而其内存已被释放后,构造函数完成执行。

回答

2

不,垃圾回收器只会清除未被引用的变量。

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

只要引用sayName,此引用就会保持活动状态。直到您释放m(或直接m.sayName),该变量才会被清空。

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

对代码封闭的引用对您的代码是隐藏的,但您可以使用开发人员工具查看它。下面是我所看到的,如果我在Chrome浏览器执行console.dir(m)

enter image description here

+0

这意味着,'sayName'有'name'参考? –

+0

@OmarElawady是的,是间接的。它对包含'name'的作用域有一个隐藏的引用。 –

+0

所以只需在函数中附加一个变量的名称就可以创建对它的引用? –