我正在努力理解闭包(其中有个笑话)并且我发现了这个:
(function () { /* do cool stuff */ })();
这是如何工作的?将函数放在括号中的目的是什么?之后的空括号为什么要加上?
我正在努力理解闭包(其中有个笑话)并且我发现了这个:
(function () { /* do cool stuff */ })();
这是如何工作的?将函数放在括号中的目的是什么?之后的空括号为什么要加上?
var b = 1;
// stuff using b
而其他一些代码使用b时,它将获得你剩下的值。 (或者更糟糕的是,如果一些其他代码在你的代码运行之前设置了b,然后尝试稍后获取其旧值,那么在此期间你已经更改了它。)
另一方面,如果你有这段代码,它声明并调用一个函数a:
function a() {
var b = 1;
}
a();
如果后续代码使用b,则不会看到您的值,因为b是函数内的局部变量。当然,问题在于您仍然在创建全局名称 - 在这种情况下是"a"。因此,我们需要一个没有名称的函数 - 这就是为什么您得到了所描述的代码。它声明了一个没有名称的函数,然后调用它。
不幸的是,您不能只是写:
function() { ... }()
因为这段代码会被解析为一个函数声明语句,并且导致语法错误。通过使用括号包裹函数声明,你可以得到一个函数表达式,之后就可以调用它了。你可以像调用其他函数表达式(比如 a)一样使用第二组括号进行调用。例如,如果函数需要参数,你可以在那里传递它们:
(function(a) { ... })(1)
这段代码创建了一个函数,调用它,然后丢弃它。
如果你这样看可能会更清晰:
var throwaway = function(){
// do cool stuff
};
throwaway();
这样做是为了创建一个私有的命名空间。函数中的代码可以拥有函数和变量,而不必担心与页面中加载的其他代码发生冲突。
(function(){ //code })();
函数内部的代码将在其定义后立即执行。
这个结构意味着声明一个匿名函数并立即运行它。你把代码放在函数体内的原因是因为你在其中定义的变量仅作为函数本地变量而不是全局变量。然而,它们仍然可以被定义在该函数内部的闭包所访问。
函数周围的括号表明该函数是一个表达式。括号后面是对函数的调用。
请注意,该函数没有名称。
(function($, var_1, var_2) {
// use JQuery, var_1 and var_2 as local variables
})($, var_1, var_2);