2010-08-01 60 views
2

說,我有一些背景,其中變量的設置和λ-函數被調用直接使用它們:JSλ-功能與「上層環境」變量

function outerContext(){ 
    ... 
    var data = ...; // some data the script uses 
    ... 
    someObject.method = function(){ 
     data; // the variable is used here 
     }; 
    ... 
    } 

我知道動態創建的函數有它創建的上下文的快照,因此data變量可以在那裏訪問。

當我使用這種動態創建的方法時,我可能面臨的這種方法會遇到什麼危險?我應該總是以這個data作爲參數嗎?還是可以?

回答

3

內部函數無法訪問「快照」,它可以完全訪問data變量。

function outer() { 
    var data = 1; 

    ... 

    someObject.method = function() { 
     data = 42; 
    }; 

    someObject.method(); 
    // data == 42 
} 

(真正的解釋是,在內部功能使用data時,JavaScript就揣摩其範圍data是,它會遍歷了作用域鏈中找到創建該變量的地方,這就是將要使用的變量。)

沒有「危險」,這是Javascript的核心競爭力之一。這就像修改對象屬性的對象方法。當然,你需要小心你想做什麼,你真的想修改變量還是隻想在本地使用它?

對於 「快照」,你需要使用閉包:

function outer() { 
    var data = 1; 

    ... 

    someObject.method = (function (data) { 
     return function() { 
      data = 42; 
     } 
    })(data); 

    someObject.method(); 
    // data == 1 
} 
3

除了導致循環引用的可能性以及DOM對象等情況下的內存泄漏之外,我無法真正想到任何「危險」。

它很像一個類中的私有變量。