1

我是 javascript 世界的新手。我正在分析此处解释的代码,以避免在编写 firefox 扩展时在全局级别造成污染。
当代码

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

正在执行 我不明白: 1)为什么代码在第 3 行
声明ns = {}
2)为什么代码在第 5 行返回 ns
3)哪个函数正在接收返回的 ns{} 以及该函数将如何使用它
4 ) ns{} 对于每个注册的命名空间总是相同的(?),那么为什么将与 fn 参数一起推送到命名空间数组中,然后在代码执行 fn.apply(ns) 时提供,因为它每次都会不同?
抱歉我的英语很差,并提前感谢您的帮助。

4

1 回答 1

3

这不是实现命名空间的最典型方式,但它是一种有趣的方式。我会尽量清楚地回答你的问题:

1.因为在数组命名空间中推送的函数需要有自己的上下文,不能污染全局命名空间。您可以声明:

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对象)。

于 2013-02-18T11:39:31.300 回答