假设我有命名空间,
var Namespace = {
A : function() {
alert('Hello!');
},
B : function() {
// Call A() from here, do other stuff
}
}
在这个命名空间中,我打算让A成为B的辅助函数。也就是说,永远不会在命名空间之外调用A()。它只会被命名空间中的函数调用。
解决命名空间中本地/辅助函数问题的最佳方法是什么?我看到它的方式有两种可能性:
// Method #1
var Namespace = {
A: function() {
alert('Method #1');
},
B : function() {
Namespace.A();
}
}
Namespace.B();
// Method #2
function Namespace2() {
var A = function() {
alert('Method #2');
};
this.B = function() {
A();
}
}
var ns2 = new Namespace2();
ns2.B();
在第一种方法中,在命名空间中的每个函数中键入Namespace.A()(重复)是很丑陋和笨拙的。这使我更喜欢方法#2。但我很好奇这里的最佳做法是什么。
答案 0 :(得分:11)
我建议将“命名空间”放在函数范围内。所有未明确公开的内容都将自然是私密的:
var Namespace = (function() {
var self = {};
// Private
var A = function() {
...
};
// Public
self.B = function() {
A();
}
return self;
}());
Namespace.B(); // Works
Namespace.A(); // Doesn't work
答案 1 :(得分:5)
您可以使用this
声明
this.A();
答案 2 :(得分:2)
你可以使用第三个选项,其中命名空间是在它自己的范围内创建的:
var Namespace = (function(){
var A = function() {
alert('scoped method');
};
function Namespace() {
var A1 = function() {
alert('Namespace "private" method');
};
Namespace.prototype.B1 = function(){
A(); //will run
A1(); //will run with no errors
};
};
Namespace.prototype.B = function(){
A(); //will run
A1(); //ERROR!
};
return Namespace;
})();
答案 3 :(得分:1)
如果您只打算在A
内使用B
,为什么不在B
内定义?
var Namespace = {
B: function() {
var A = function() {
...
}
A();
}
};
Namespace.B();
答案 4 :(得分:-2)
var Namespace = {
A : function() {
alert('Hello!');
},
B : function() {
Namespace.A();
},
}
注意结尾的分号