在javascript中使用命名空间

时间:2016-05-19 09:02:39

标签: javascript

我正在阅读this JavaScript code

我不明白,这就是为什么作者这样做:

(function(namespace) {
    //more stuff here
    namespace.Game = Game;
})(window);

namespace.Game = Game;代替window.Game = Game;的目的是什么?

是否可以使Game函数重用?

5 个答案:

答案 0 :(得分:4)

看起来作者来自C ++社区:P,所以他使用了变量名“namespace”!!!

这创建了IIFE(立即调用函数表达式),因此他/她可以创建私有/隔离范围,他通过减少范围查找时间来传递全局窗口对象作为增强性能的参数。(记住Javascript查找属性在本地范围和方式上链接到全球范围)。因此,在本地范围访问窗口对象会减少查找时间。然后他/她用属性“Game”更新了全局对象。

答案 1 :(得分:1)

创建IIFE(立即调用函数表达式)并将window对象作为参数传递,因此当前函数表达式具有自己的隔离范围,仍然可以显式控制访问全局变量

答案 2 :(得分:1)

我将在下面的文字中将Game称为foo

通过这样做,foo可以通过全球window访问,例如window.foo。但是,关于在何处共享foo的决定不应来自撰写foo的同一个人,而应来自在其代码中集成foo的人 。这只是提高互操作性/可重用性的最佳实践。

如果您不这样做,IIFE以外的任何人都无法看到foo

如果您直接将foo分配给window,则其他实施方必须修改您的代码,而不是更改单个参数。这完全取决于您在代码中真正需要什么样的知识。你真的想知道foo将在哪里分享,或者你只是想在某个地方分享它?

此外,如果您只是从 IIFE 中访问window,则表示您正在访问全局变量。请阅读here - “不要污染全局命名空间”

答案 3 :(得分:0)

要了解IFEE的要点,请参阅 What is the (function() { } )() construct in JavaScript? 。基本上,它都是尽可能地避免全局变量。

那么在这种情况下使用namespace参数呢?好吧,namespace的值是window对象,因为window对象传递给self-executing anonymous function encapsulates您的代码为namespace参数。所以,namespace.Game = window.Game

直接使用namespace参数而不仅仅是window对象的一个​​原因是因为namespace可以是minified,而window则不能...... 。这意味着如果你需要经常引用window对象,你可以节省很多字节。

使用namespace变量的另一个原因是,您可能希望您的代码与window对象不存在的其他环境(如NodeJS)在以后的某些环境兼容。或者,您可能希望将代码重写为例如。一个RequireJS模块。除了围绕代码的匿名函数之外,不会对window对象进行硬编码,这样可以更容易。

或者您可能只想稍后更改scope?也许你想在以后的某个时间点将Game添加到另一个对象?如果你避免将window对象硬编码到除代码周围的匿名函数之外的任何地方,那么这也会容易得多。

答案 4 :(得分:0)

此表达式称为IIFE(立即调用的函数表达式)。主要用途是创建范围'。因为只有函数在javascript中创建范围。如果要从全局环境中隐藏值,可以使用IIFE。

(function(namespace) { // begin IIFE
// These values inside can not be accessed from global.
// But we do need a way to access these values, we add all values to 'namespace',
namespace.Game = Game;
// we pass window to this IIFE, so 'namespace == 'window' inside it.
// namespace can be anyword, it is just a parameter.
// since 'window' is value exist in global, all data we appended to it can be access from global via 'window'.
// You can pass any object, or anything, it is just an argument, just like you invoke a function. e.g. if we pass 'Steam'( an object created before), then we can run 'Steam.Game'.
})(window);    // end IIFE
// later we can ,
// window.Game