关于javascript:以这种方式向匿名函数传递参数的目的是什么?

What is the purpose of passing arguments to anonymous functions in this manner?

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

Possible Duplicate:
How do JavaScript closures work?

我在玩谷歌闭包编译器,输入随机代码看看它会做什么。

它重写了我的一个函数,使其看起来像这样:

1
(function(msg) { console.log(msg); })("Hello World!");???????

其中,"Hello World"似乎是作为msg传递给它前面的匿名函数的参数。我看了一会儿,觉得在jquery插件中我看到了类似的东西,类似于:

1
2
3
(function( $ ) {
  ...
})(jQuery);

在与$的冲突范围内,这对我来说更有意义。但是,将参数传递到这样一个匿名函数的主要原因或目的是什么?为什么不简单地将参数定义为函数中的变量呢?编写这样的函数有什么性能或灵活性优势吗?


还有一个显著的差异与范围有关。以下代码:

1
(function(msg) { console.log(msg); })("Hello World!");???????

在某些情况下,命名空间污染比这更严重:

1
2
var msg ="Hello World!";
console.log(msg);

因为第二个代码在不再需要变量之后会留下变量,但可能会干扰代码的其他部分。

当您在任何其他函数之外执行上述代码时,这一点尤其重要:在这种情况下,msg变量将作为全局变量在页面的任何位置都可用。


这有点取决于上下文。有些情况下,编译器根本不会尝试内联任何函数(例如,如果作用域函数包含"eval")。如果这是一个全局范围内的,并且您正在高级模式下运行,那么仅仅是在编译器停止尝试内联函数之后出现了内联机会(或者内联代码中有一个bug,它错过了这个机会)。如果在高级模式下通过编译器运行示例输出,则会得到:

1
console.log("Hello World!");


基本上,最好将代码包装在下面:(function(){/*code*/}());,以防止var与其他人的var发生冲突。

我认为闭包编译器最主要的功能是保存5个字符:var =