关于javascript:为什么我们在一个语句中将函数包装在括号中两次?

Why do we wrap the function in parenthesis two times in a statement?

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

Possible Duplicate:
What is the purpose of a self executing function in javascript?
Explain JavaScript's encapsulated anonymous function syntax

例如:

1
2
3
(function($) {
document.getElementById("foo").innerHTML = 'bar';
})();

我知道我们想要创建自己的范围来防止变量冲突,但为什么javascript需要有()()?


那没有()(),它有(function(){})()

函数语法是function(){},函数调用运算符是()。包装函数的括号在技术上并不特殊,您可以用!替换它们:

1
!function(){}()

这样做是行不通的:

1
function(){}()

因为这在语句上下文中,function启动函数声明而不是表达式。然后语法失败,因为函数声明必须具有名称。

如果我们有!function(){}(或(function(){}),那么它不能是一个语句,因为!(或()已经需要一个表达式,所以它将被视为一个表达式。

所以你可以毫不费力地做到这一点:

1
2
3
var a = function() {
        return false;
}();

因为var a =已经期望一个表达式,所以function不可能是函数声明的开头。

一个简单的方法来测试你的函数是否会被视为表达式或声明是问自己,我可以在这里使用var x吗?

例如:

1
2
3
4
5
var x; //all is fine, so if I said function here, it would be a start of a function declaration

(var x) //Gives an error, so replacing var x with a function would be a function expression

var myVar = var x; //Gives an error, so replacing var x with a function would be a function expression

等等


这使它成为一个自我调用的匿名函数。

1
2
3
(function() {
    /* function body */
}) /* <-- end of function definition */ (); // <-- invoke that function immediately


第一个导致函数,与(2)导致2的方式相同。第二个叫它。