以这种方式将参数传递给匿名函数的目的是什么?

时间:2012-10-02 21:23:23

标签: javascript jquery google-closure-compiler

  

可能重复:
  How do JavaScript closures work?

我正在玩Google Closure Compiler,随机输入代码来查看它会做什么。

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

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

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

(function( $ ) {
  ...
})(jQuery); 

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

3 个答案:

答案 0 :(得分:13)

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

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

在某些情况下,在名称空间污染方面比这更清晰:

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

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

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

答案 1 :(得分:0)

基本上,将代码保存在此代码中始终是一个好主意:(function(){/*code*/}());以防止您的vars与其他人发生冲突。

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

答案 2 :(得分:0)

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

console.log("Hello World!");