[英]How can closures access destructed variables?
當我學習創建對象的方法時,我發現了耐用的構造器模式 ,該模式取決於閉包和創建私有變量的方法。
因此,例如:
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
此引用就保持sayName
。 直到您釋放m
(或直接m.sayName
),該變量才會被廢棄。
必須將閉包視為從函數到創建它的作用域的引用(這也是為什么閉包經常被指出是JavaScript中內存泄漏的常見原因之一)。 該引用使得可以從內部函數訪問創建范圍的變量(它們不是副本,這意味着兩個內部函數共享相同的變量)。
閉包范圍的引用從您的代碼中隱藏了,但是您可以使用開發人員工具看到它。 這是我在Chrome中執行console.dir(m)
的結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.