2010-06-12 74 views
5

我一直在嘗試學習閉包(使用Javascript),這種方式在C#和C++多年以後會傷害我的大腦。我認爲我現在有一個基本的理解,但有一件事困擾我:我已經在這個探索尋求知識中訪問過很多網站,而且我看不到任何一個單詞(或者甚至是一個簡單的雙詞短語),意思是「一套的共享執行上下文的Javascript關閉「。例如:你怎麼稱呼一組共享上下文的Javascript關閉?

 
function CreateThingy (name, initialValue) 
{ 
    var myName = name; 
    var myValue = initialValue; 

    var retObj = new Object; 

    retObj.getName = function() { return myName; } 
    retObj.getValue = function() { return myValue; } 
    retObj.setValue = function(newValue) { myValue = newValue; } 

    return retObj; 
}; 

從我讀到的,這似乎是實現數據隱藏的一種常見方式。 CreateThingy返回的值當然是一個對象,但是你會怎麼稱呼該對象屬性的函數集呢?每一個都是封閉的,但我想用一個名稱來描述(並思考)所有這些名稱作爲一個概念實體,我寧願使用一個普遍接受的名稱而不是一個名稱。

謝謝!

- 埃德

回答

3

克羅克福德普及術語「privileged method」來命名,即有機會獲得它的構造函數的範圍的功能(其中私人成員被宣佈)。

我會打電話給他們「一組共享共同封閉範圍的JavaScript函數」

「執行上下文」您所發佈的短語的一部分,可以創建在說明書中描述的Execution Contexts之間混淆,this值,其也被普遍稱爲「函數上下文」「對象上下文「,以及函數作用域,這是真正在這裏引用的內容。

0

它接近模塊模式。使用表達式像這樣:

var thingy = (function(specObj) { 
    var my = {}, 
     privateVar = blah, 
     someOtherPrivateVar = []; 

    my.getSomeVal() { 
     return specObj.someVal; 
    } 
    my.getAnotherVal() { 
     return specObj.AnotherVal; 
    } 
}({ 
    someVal: "value", 
    anotherVal: "foo" 
})); 

我一個對象文本初始化,因爲使用命名對象將允許啄的狀態,通過改變命名對象進行更改。還有其他的選擇可以做到這一點。

下面是關於模塊模式的變化另一個很好的鏈接: http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth

毋庸贅言,但Crockford的的Javascript:好的部分包含此風格和具體利益的一個良好的治療效果。