我遇到了一个JS文件,可以归纳为以下代码:
(function(window){
// some codes here
})(window);
我想知道这段代码意味着什么?窗口有特殊含义,还是只是一个参数?我们在括号中看到的两个“窗口”之间有什么区别?
由于此函数没有名称,我认为它是一个匿名函数,所以它只调用一次吗?什么时候被调用?
答案 0 :(得分:4)
这称为立即调用的匿名函数。 (简称IIAF。)
在这种情况下,您定义的函数接受一个名为“window”的参数,该参数将覆盖该范围内的全局window
对象。
这里的踢球者就是在定义函数之后,你立即调用它,传入全局window
对象 ,就好像你在其中使用全局引用一样功能关闭!
大多数情况下,这样做的目的是通过将所有潜在变量包装在匿名范围内来避免污染全局命名空间。
答案 1 :(得分:1)
这是一个关闭。有问题的代码是一个匿名函数,它将使用“window”参数(代码段的结尾)执行。它不会污染全局命名空间。
答案 2 :(得分:1)
关于window
的问题,底部括号中的window
是对全局window
对象的引用。第一个window
只是参数的名称。但在这种情况下,它引用了全局window
对象,因为您使用的是匿名自调用函数。您可以将其称为monkeys
并且它不会产生任何影响(当然,您必须在匿名函数的主体内使用monkeys
,以引用参数)。现在,您现在可以在函数中引用全局窗口对象。
是的,该函数被调用一次,并在定义后立即调用。这是因为它是一个自我调用的匿名函数。
答案 3 :(得分:0)
第一个窗口是形式参数,而第二个窗口是实际调用函数的实际参数。这种类型的函数称为自调用函数。 它的好处是以这种方式包装函数不会混淆全局范围。
答案 4 :(得分:0)
它是一个立即调用的函数表达式。围绕函数表达式(实质上是没有名称的函数声明)的分组运算符()意味着计算所包含的函数并返回函数对象。函数后跟一个形式参数列表(另一组())会导致函数被调用,所以:
(function() {
alert('hey');
})();
创建一个立即调用并运行一次的匿名函数。它不会创建任何全局变量,也不会留下它存在的痕迹。
将标识符window
传递给函数意味着它传递了它引用的任何内容。这里的假设(我想)是它将引用一个全局窗口对象,在浏览器中,它是全局对象。但是,在没有全局窗口对象的环境中,可能未定义。在我看来,这是毫无意义的练习。
如果您担心引用全局对象,请从全局上下文传递this
:
(function(global) {
// global refernces the global object
})(this);