我正在阅读this JavaScript code。
我不明白,这就是为什么作者这样做:
(function(namespace) {
//more stuff here
namespace.Game = Game;
})(window);
namespace.Game = Game;
代替window.Game = Game;
的目的是什么?
是否可以使Game
函数重用?
答案 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