在javascript中使用名称空间

在javascript中使用名称空间,javascript,Javascript,我在看书 我不明白的是,作者为什么这样做: (function(namespace) { //more stuff here namespace.Game = Game; })(window); namespace.Game=Game的目的是什么而不是window.Game=Game 它是否使游戏功能可重用 作者创建IIFE(立即调用的函数表达式)并将窗口对象作为参数传递,因此当前函数表达式有它自己的独立范围,仍然对访问全局变量进行显式控制要了解其要点,请参见。基本上,这都是为

我在看书

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

(function(namespace) {
    //more stuff here
    namespace.Game = Game;
})(window);
namespace.Game=Game的目的是什么而不是
window.Game=Game


它是否使
游戏
功能可重用

作者创建IIFE(立即调用的函数表达式)并将
窗口
对象作为参数传递,因此当前函数表达式有它自己的独立范围,仍然对访问全局变量进行显式控制

要了解其要点,请参见。基本上,这都是为了尽可能避免全局变量

那么在这个上下文中如何使用
名称空间
参数呢?当然,
名称空间
的值是
窗口
对象,因为
窗口
对象作为
名称空间
参数传递给您的代码。所以,
namespace.Game
=
window.Game

使用
名称空间
参数而不仅仅是直接使用
窗口
对象的一个原因是
名称空间
可以,而
窗口
不能。。。这意味着如果需要大量引用
窗口
对象,可以节省大量字节

使用
名称空间
变量的另一个原因是,您可能希望您的代码与以后不存在
窗口
对象(如NodeJS)的其他环境兼容。或者,您可能希望将代码重写为模块。不硬编码
窗口
对象,除了围绕代码的匿名函数外,使这变得容易得多


或者你只是想在以后的某个时间点改变你的想法?也许您想在以后的某个时间点将您的
游戏添加到另一个对象?如果您避免对
窗口
对象进行硬编码(除了围绕代码的匿名函数),这也会容易得多。

我将在下面的文本中将
游戏
称为
foo

这样,可以通过全局
窗口
访问
foo
,如
window.foo
。然而,关于在何处共享
foo
的决定不应该来自编写
foo
的同一个人,而应该来自将
foo
集成到其代码中的人。这只是改进互操作性/可重用性的最佳实践

如果您不这样做,
foo
将不会被系统外的任何人看到

如果您直接将
foo
分配给
窗口
,则另一个实现方必须修改您的代码,而不是更改单个参数。这一切都是关于你在代码中真正需要什么样的知识。你真的想知道在哪里共享
foo
,还是只想在某个地方共享


此外,如果您只是从您的生活中访问
窗口
,那么您正在访问一个全局变量。请阅读-“不要污染全局命名空间”。

此表达式称为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 

看起来像作者来自C++社区:P,所以他使用变量名“命名空间”!!!p>


本文的作者创建了IIFE(立即调用的函数表达式),这样他/她就可以创建私有/隔离的作用域,他正在传递全局窗口对象作为参数,通过减少作用域查找时间来提高性能。(记住Javascript在局部作用域中查找属性,并向上链接到全局作用域)。因此,在局部范围访问窗口对象可以减少查找时间。然后,他/她用属性“Game”更新了全局对象。

重复:@ste2425:OP的一条评论:
我对iLife没有混淆,这就是为什么他将Game分配给namespace.Game而不是window.Game
。从这个评论来看,我认为这个问题不符合重复的条件。无论如何,我添加了这个问题以消除歧义,因为其他一些人似乎将其解释为要求解释使用IFEE的意义…这就像向windows对象添加属性一样?你说的缩小是什么意思?玩视窗游戏有什么不对?对我来说也是一样。@Haris Z:直接使用
window.Game
没有什么错。在您提到的代码示例中,将其分配给变量更有效。无论如何,我添加了一些更多的信息。我希望这有帮助?@JohnSlegers说这种技术用于
缩小
的好处就像说我们使用汽车是因为它们看起来很漂亮。@M K:更好的缩小是我在仅前端代码中使用这种技术的主要原因。如果你认为这不是一个合理的理由,请详细说明@JohnSlegers我是在回应你的评论
这种技术到底是如何避免使用全局变量的?它所做的只是用namespace.Game替换window.Game,其中namespace是对window对象的引用。
但是我现在意识到,你指的是全局的消耗,而不是全局的污染、泄漏/创建。分配windows.Game比namespace.Game有什么错?我没有与iLife混淆,这就是为什么他将Game分配给namespace.Game而不是window.GameWell,Kyle Simpson在他的You-not-Know JS:Scope和Closures中解释为“这样我们就有了一个清晰的全局和非全局引用的风格描述”。为什么不直接使用window.Game呢?六羟甲基三聚氰胺六甲醚。。。因为这不是一种常见的做法,更重要的是,最好在模块化代码块中设置您自己的变量。所以,如果他执行window.Game,参数名称为window,是否可以?@HarisZ