10

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

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

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

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

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

4

4 回答 4

7

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

NAMESPACE.foo = function(){}and(function(){})()都是函数表达式,并且(就像函数声明一样)界定内部范围并可以访问其外部范围内的变量/函数。

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

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

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

阅读材料

于 2012-09-07T08:33:06.097 回答
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 时可以很好地分离关注点。

于 2012-09-07T08:30:13.580 回答
0

使用命名空间会将某些东西放入全局范围。

将所有内容包装在一个函数中并仅使用本地范围的变量不会。

后者显然更适合限制范围。

如果您需要将部分代码公开给页面中的其他代码(这对于库来说很典型),请使用命名空间。不过,在函数中定义它的所有部分,因为这样可以减少数据逃逸到全局的机会,并为命名空间中的共享私有数据提供一个闭包。

于 2012-09-07T08:16:52.977 回答
0

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

于 2012-09-07T08:27:25.660 回答