60

可能重复:
JavaScript 闭包是如何工作的?

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

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

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

看起来这"Hello World"是传递msg给它之前的匿名函数的参数。我看了一会儿,以为我在 jQuery 插件中看到过类似的东西,看起来像:

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

在与$. 但是将参数传递给这样的匿名函数的主要原因或目的是什么?为什么不简单地将参数定义为函数中的变量?编写这样的函数是否有任何性能或灵活性优势?

4

3 回答 3

20

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

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

在某些情况下,在命名空间污染方面比这更干净:

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

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

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

于 2012-10-02T21:27:39.493 回答
0

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

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

于 2012-10-02T21:34:50.097 回答
0

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

console.log("Hello World!");
于 2012-10-03T01:02:57.950 回答