命名空间vs自调用函数

时间:2012-09-07 08:14:47

标签: javascript

我有一个问题:在Javascript中限制范围的更好方法是:使用这样的命名空间:

var NAMESPACE = {};
NAMESPACE.foo = function() { 
   console.log('Hello');
}
NAMESPACE.foo();

或者我应该使用像这样的自我调用函数

(function() {
    function foo() { console.log('Hello'); }
    foo();
})();

拥有一个命名空间总是好的,或者我可以省略它,如果我只使用一个大的自我调用函数来放置我所有的东西?

4 个答案:

答案 0 :(得分:7)

您的两个代码示例都有非常不同的应用程序。

NAMESPACE.foo = function(){}(function(){})()都是函数表达式,并且(就像函数声明一样)界定内部作用域,并且可以访问其外部作用域中的vars /函数。

主要区别在于,使用命名空间,您可以在与命名空间相同的范围内调用函数,而IIFE只会在遇到时执行。

没有上下文就没有“最佳实践”,所以我举一些例子:

  • 如果你的函数表达式只应该执行一次,那么一个IIFE就可以很好地完成这项工作,而命名空间会占用一些内存,直到它被垃圾回收。
  • 如果您的函数表达式会多次运行(例如在for循环内),则IIFE会导致性能下降(JSLint建议 <或者<事实上任何人)。最好有一个定义的函数对象,你调用多次,而不是为每次迭代创建一个新的函数对象。
  • 最终,这取决于您的用户案例。 IIFE在遇到时执行(例如程序/函数体,IF块等),而命名空间将存储函数对象并允许您在需要时调用它,前提是它在给定范围内可访问。

阅读材料

答案 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)

您应该将所有代码包装在自调用函数中,如果需要与应用程序的其他部分共享某些功能,请将这些方法分配给自定义命名空间。这样你就只能暴露出你需要的东西。