关于javascript:这段JS代码是什么意思?

What does this block of JS code mean?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the purpose of wrapping whole Javascript files in anonymous functions like"(function(){ … })()"?

我遇到了一个JS文件,可以汇总到下面的代码:

1
2
3
   (function(window){
              // some codes here
                    })(window);

我想知道这段代码意味着什么? 窗口有特殊含义,还是只是一个参数? 我们在括号中看到的两个"窗口"之间有什么区别?

由于此函数没有名称,我假设它是一个匿名函数,所以它只调用一次吗? 什么时候被调用?


这称为立即调用的匿名函数。 (简称IIAF)

在这种情况下,您将定义一个函数,该函数接受一个名为"window"的参数,该参数将覆盖该范围内的全局window对象。

这里的踢球者就是在定义函数之后,你立即调用它,传入全局window对象,就好像你在函数闭包中使用全局引用一样!

大多数情况下,这样做的目的是通过将所有潜在变量包装在匿名范围内来避免污染全局命名空间。


至于你关于window的问题,底部括号中的window是对全局window对象的引用。第一个window只是参数的名称。但在这种情况下,它引用了全局window对象,因为您使用的是匿名自调用函数。您可以将其称为monkeys并且它不会产生任何影响(当然,您必须在匿名函数的主体内使用monkeys,以引用参数)。现在,您现在可以在函数中引用全局窗口对象。

是的,该函数被调用一次,并在定义后立即调用。这是因为它是一个自我调用的匿名函数。


这是一个关闭。有问题的代码是一个匿名函数,它将使用"window"参数(代码段的结尾)执行。它不会污染全局命名空间。


它是一个立即调用的函数表达式。围绕函数表达式(实质上是没有名称的函数声明)的分组运算符()意味着计算所包含的函数并返回函数对象。函数后跟正式参数列表(另一组())会导致函数被调用,因此:

1
2
3
(function() {
  alert('hey');
})();

创建一个立即调用并运行一次的匿名函数。它不会创建任何全局变量,也不会留下其存在的痕迹。

将标识符window传递给函数意味着它传递了它引用的任何内容。这里的假设(我想)是它将引用一个全局窗口对象,在浏览器中,它是全局对象。但是,在没有全局窗口对象的环境中,可能未定义。在我看来,这是毫无意义的运动。

如果您担心引用全局对象,则从全局上下文传递this

1
2
3
(function(global) {
  // global refernces the global object
})(this);

第一个窗口是形式参数,而第二个窗口是实际调用函数的实际参数。这种类型的函数称为自调用函数。
它的好处是以这种方式包装功能不会混淆全局范围。