簡體   English   中英

閉包如何訪問析構變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM