在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