我正在玩Google Closure Compiler,随机输入代码来查看它会做什么。
它重写了我的一个函数,看起来像这样:
(function(msg) { console.log(msg); })("Hello World!");
"Hello World"
似乎是作为msg
传递给它前面的匿名函数的参数。我看了一会儿,并且认为我在jQuery插件中看到了类似的东西:
(function( $ ) {
...
})(jQuery);
在与$
的冲突范围内,现在对我更有意义。但是将参数传递给这样的匿名函数的主要原因或目的是什么?为什么不简单地将参数定义为函数中的变量?编写这样的函数是否有任何性能或灵活性优势?
答案 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!");