2012-04-27 39 views
6

在Javascript中,命名空間和閉包有什麼區別?他們看起來和我很相似。Javascript - 命名空間與封閉之間的區別?

編輯

具體來說,this article討論命名空間和封鎖,並有像

句子現在,我們還是得情況下,我們會想聲明 變量,唐自然適合命名空間對象 結構。但我們不希望這些變量具有全局範圍。這是 自我調用函數進來的地方。

它繼續給看起來很像閉包,作爲「對象命名空間」。它看起來像我的名字空間是一個closure ...但也許它不是...?幫幫我?

+1

詳細說明您對「命名空間」的定義。 – 2012-04-27 03:32:46

+0

Javascript沒有名稱空間。這個詞是什麼意思? – 2012-04-27 03:33:52

+1

在javascript中沒有「名稱空間」的含義,因爲有很多方法可以完成將符號分隔爲空格(包括關閉)的任務。顯示一些代碼。 – 2012-04-27 03:34:06

回答

23

命名空間本質上是一個Object與你推到的東西,所以你不要有類似的和/或在你的範圍內運行衝突的名字一組變量沒有有趣的性質。因此,舉例來說,像

MyNS = {} 
MyNS.x = 2 
MyNS.func = function() { return 7; } 

當一個函數「保留」 A閉合的未在其定義的變量的值,即使這些變量已超出範圍。看看下面:

function makeCounter() { 
    var x = 0; 
    return function() { return x++; } 
} 

如果我讓c = makeCounter()然後反覆調用c(),我會得到0, 1, 2, 3, ...。這是因爲makeCounter定義爲「關閉」的內部匿名函數的範圍超過x,因此即使x超出範圍,它也會引用該範圍。

值得注意的是,如果我再做d = makeCounter()d()將開始從0開始計數。這是因爲cd得到x不同實例。

+0

這是一個非常好的答案 - 謝謝!會給它一些時間雖然:) – Ben 2012-04-27 03:44:26

+0

+1我終於明白關閉(我已經嘗試了2-3個教程,總是放棄) – ajax333221 2012-04-27 03:46:43

+0

是的,這是最簡潔和有用的解釋我已經看到封閉 - 謝謝!現在我懂了。 – iono 2012-08-11 12:13:19

5

命名空間通常是一種將所有全局變量作爲屬性置於一個主全局變量下的方法,因此僅添加一個新的真正的頂級全局變量。它可以防止全球名稱空間的污染,並減少與其他全局變量發生衝突的機會。命名空間的

而且例如:

var YUI = {}; 
YUI.one = function(sel) {...}; 
YUI.two = function(sel) {...}; 
YUI.three = function(sel) {...}; 

有一個在頂層的全局命名空間YUI一個新的項目,但也有通過YUI的命名空間對象的多個全局訪問項目。

閉包是一個功能塊,由於持續引用了函數的內部部分,該功能塊的持續時間超出了函數執行的正常結束時間。

function doSometing() { 
    var x = 10; 
    setTimer(function() { 
     // this gets called after doSomething() has finished executing 
     // but because of the function closure, the variables 
     // inside of the parent scope like x are still accessible 
     x += 10; 
    }, 1000); 
} 
2

http://jibbering.com/faq/notes/closures/

的封閉通過返回一個從該函數調用的函數調用的執行上下文中創建的功能對象和另一個的屬性分配給該內部函數的參考形成目的。或者,通過直接將對這樣的函數對象的引用分配給例如全局變量,全局可訪問對象的屬性或通過引用傳遞的對象作爲外部函數調用的參數。

命名空間只是一個約定,創建的對象可避免使用變量混淆全局範圍。

+0

歡迎來到SO,@GeoffreyHing!感謝您的幫助,但在我看來,「關閉」段落過於複雜且非常混亂......但名稱空間解釋清晰簡潔,+1。 – Ben 2012-04-27 03:50:15