2013-02-18 35 views
1

我是javascript新手專區。我正在分析解釋here的代碼,以避免在編寫Firefox擴展時在全球範圍內造成污染。
當代碼關於在javascript中註冊的名稱空間

1. // Namespace registration 
2. this.ns = function(fn) { 
3. var ns = {}; 
4. namespaces.push(fn, ns); 
5. return ns; 
6. }; 

正在執行我不理解:
1)爲什麼代碼聲明NS = {}在3線
2)爲什麼代碼返回納秒在線路5
3)哪個函數接收返回的ns {}以及函數如何使用它
4)ns {}對於每個已註冊的名稱空間都是相同的(?),所以爲什麼在命名空間數組中與fn一起被推入參數,然後提供鱈魚時e正在執行fn.apply(ns),因爲每次都會有所不同?
對不起,我可憐的英語,並提前感謝您的幫助。

回答

3

這不是實現名稱空間的最典型的方式,但它很有趣。我會盡力回答您的問題儘可能明確:

因爲這是在陣列的命名空間推功能需要有自己的背景和不污染全局命名空間。你可以聲明:

extension.ns(function() { 
    this.myVar = 5; 
}); 

你的每一個匿名函數被調用this將對應於給定功能ns對象的時間。這是因爲調用函數的方式(使用apply)。

2.代碼返回ns,因爲您可能需要向上下文對象添加額外的屬性或方法。

3.在給出的例子中沒有。如果你使用:

function foo() { 
    alert(this.bar); 
} 

var ns = extension.ns(foo); 
ns.bar = 'foobar'; 

當函數foo從擴展你應該得到的文本警報調用指定:「foobar」(函數體this將是ns對象)。

4.每個ns是不同的。當每次創建不同的對象時使用ns = {};時,引用指向不同的對象,因此每個聲明的函數的每個上下文都不相同(對於上下文,您可以考慮對象ns)。

+0

謝謝!我會嘗試用你給我的額外信息重新分析代碼。 – mty 2013-02-18 11:56:50

+0

如果您還有其他問題,歡迎隨時提供幫助。 – 2013-02-18 11:57:16

相關問題