我有一个问题:在Javascript中限制范围的更好方法是:使用这样的命名空间:
var NAMESPACE = {};
NAMESPACE.foo = function() {
console.log('Hello');
}
NAMESPACE.foo();
或者我应该使用像这样的自我调用函数
(function() {
function foo() { console.log('Hello'); }
foo();
})();
拥有一个命名空间总是好的,或者我可以省略它,如果我只使用一个大的自我调用函数来放置我所有的东西?
答案 0 :(得分:7)
您的两个代码示例都有非常不同的应用程序。
NAMESPACE.foo = function(){}
和(function(){})()
都是函数表达式,并且(就像函数声明一样)界定内部作用域,并且可以访问其外部作用域中的vars /函数。
主要区别在于,使用命名空间,您可以在与命名空间相同的范围内调用函数,而IIFE只会在遇到时执行。
没有上下文就没有“最佳实践”,所以我举一些例子:
for
循环内),则IIFE会导致性能下降(JSLint建议 <或者<事实上任何人)。最好有一个定义的函数对象,你调用多次,而不是为每次迭代创建一个新的函数对象。答案 1 :(得分:3)
我倾向于将两者结合起来。我不确定这是否被视为最佳实践,但它对我有用:)
var app = { }; //or whatever your namespace is
(function(){
app.memberA = {
init: function() { },
anotherFunction: function() { }
// ...
};
})();
(function(){
app.memberB = {
init: function() { }
// So on...
};
})();
成员A和B将在单独的js资源文件中定义 - 捆绑和缩小以进行生产!我发现在构建OO JS时,这可以很好地分离关注点。
答案 2 :(得分:0)
使用命名空间会将某些内容放入全局范围。
在函数中包装所有内容并仅使用本地范围的变量不会。
后者显然更适合限制范围。
如果需要将代码的某些部分公开给页面中的其他代码(这是库的典型代码),请使用命名空间。尽管如此,在函数中定义它的所有部分,因为这样可以减少数据转义为全局的可能性,并为命名空间中的共享私有数据提供闭包。
答案 3 :(得分:0)
您应该将所有代码包装在自调用函数中,如果需要与应用程序的其他部分共享某些功能,请将这些方法分配给自定义命名空间。这样你就只能暴露出你需要的东西。