2011-11-18 73 views
0

我已經多次聽到這些詞彙。坦率地說,我認爲命名空間是一個保存標識符的環境(以及映射到它的唯一「值」)。上下文就像一個數據集,非常類似於映射類型。我對這些感到困惑。如果任何人都可以更清楚地描述這些術語,這將是很好的。上下文和命名空間有什麼區別?

回答

1

這可能取決於你正在考慮的語言有關,但是使用一些JavaScript爲例:

var FOO = { 
    bar:function(){ 
     return this == FOO; //=> true 
     } 
    }; 

在這情況下,你可以說FOO是一個行爲像一個命名空間。儘管JavaScript沒有名稱空間的正式概念,但我們已經定義了一個對象並正在使用它來分隔一定的代碼。

上下文通常是運行某些內容的環境。在此示例中,功能塊函數具有由關鍵字引用的上下文。當運行的功能,像這樣:

FOO.bar(); 

我們調用FOO對象的上下文中的函數,所以FOO被分配到這個。我們可以不同的上下文中運行代碼:

var BAZ={}; 
BAZ.bar = FOO.bar; 
BAZ.bar(); 

這一次函數的上下文是BAZ,因此,返回值將是錯誤的。

因此,這兩個術語都定義了某種環境,但命名空間是一個固定的環境,而上下文可能會根據代碼的運行方式而改變。

1

我傾向於看它是這樣的:

命名空間是在其中發現有上下文項的容器。

例如。

想想房子。

每間臥室都有一張牀。假設有主臥室,兒童臥室和備用臥室。

這裏的名稱空間是臥室的名稱,例如Master,Child,Spare。

現在,主臥室有一張雙人牀,兒童臥室一張單人牀和備用房間一張摺疊牀。

的雙人牀只有主臥室內的情況下,單人牀僅在兒童臥室和空餘的房間內的摺疊牀。

現在,所有的臥室有傢俱的物品(牀,梳妝檯,大衣櫃),這些都是在傢俱空間中定義的。

如果所有房間參考/使用的傢俱命名空間,然後牀,梳妝檯,大衣櫃都內的客房有效的上下文,而是一張雙人牀不是孩子或空餘的房間內有效。

你當然可以把一張摺疊牀到兒童臥室在這種情況下,將有背景有,雖然這將是不同的上下文到的摺疊牀已經在空餘的房間。

如果你刪除一個房間(比如發生了火災),那麼有環境中它也將被銷燬例如傢俱主臥室發生火災將摧毀雙人牀,梳妝檯和衣櫃。

+0

謝謝。你的描述性,現實生活中的例子和其他兩個程序化例子很好地解釋了這些概念。 – 0xc0de

1

你說的關於Namespace是正確的,我會解釋你在編程方式堂妹我不是一個理論的人。

namespace SampleNamespace 
{ 
    class foo 
    { 
      public void run() 
     { 
      console.writeline("RUN"); 
     } 
    } 
} 

見上文命名空間SampleNamespace包含類foo,現在這裏的命名空間是一個環境和類是它的數據,所以另一個名字空間也可以包含類「富」,但相同的命名空間不能包含同一個類。名稱空間可以包含n個標識符,就像組織您的程序以避免使用同名的類一樣。

上下文:它與Namespace完全不同,它不是一個環境,但它爲對象定義了一個環境。所以,你可以說環境是屬性的集合定義對象的環境

+0

嘿非常感謝:) – 0xc0de

0
Scope is often confusing in JavaScript - on the one hand, 

它可能意味着在其下的東西被調用(或執行),並且對 另一方面它是在其下的東西被定義的對象的對象。 後者被稱爲詞法範圍,並被認爲是JavaScript中的真實範圍。詞彙範圍界定使得這種編程技術成爲閉包;作爲參考,請看看Richard Cornford撰寫的優秀文章 。

的範圍內調用過程中的想法被稱爲執行上下文中 的JavaScript

這從dojo documentation website 段落是對我有幫助。我認爲這是一個關於這個問題的好資源。

相關問題