JavaScript函数附加括号

JavaScript函数附加括号,javascript,Javascript,在函数声明(最后一行)之后,括号在做什么 这段代码看起来有点棘手,因为它声明了一个变量,给它赋值,声明了一个函数(这发生在前面,但在代码中是第三个),然后有一个不做任何事情的表达式。让我们把它分解一下: 首先,它声明变量a,并将0赋值给它: var a = 0; 然后声明一个函数: function foo(a) { alert(a); } var a = 0; (function foo(a) { alert(a); })(a); 然后它有一个表达式,它什么也不做: (a

在函数声明(最后一行)之后,括号在做什么


这段代码看起来有点棘手,因为它声明了一个变量,给它赋值,声明了一个函数(这发生在前面,但在代码中是第三个),然后有一个不做任何事情的表达式。让我们把它分解一下:

首先,它声明变量
a
,并将
0
赋值给它:

var a = 0;
然后声明一个函数:

function foo(a) {
    alert(a);
}
var a = 0;
(function foo(a) {
    alert(a);
})(a);
然后它有一个表达式,它什么也不做:

(a);
这里的关键是函数声明是一个声明,而不是一个表达式,因此它后面的
(a)
不适用于它。JavaScript有函数声明和函数表达式。函数声明总是有一个函数名;函数表达式可以是命名的或匿名的

如果我们稍微更改代码,我们可以将其作为函数表达式,这意味着
(a)
将调用函数:

function foo(a) {
    alert(a);
}
var a = 0;
(function foo(a) {
    alert(a);
})(a);
开头的
将解析器置于一种需要表达式的模式,它将函数声明更改为函数表达式(具体地说,命名表达式)。这意味着我们可以通过在函数后面放置
(a)
来立即调用函数

有很多方法可以让解析器进入它需要表达式的模式,parens只是一种方法。您也可以使用任何一元运算符:

var a = 0;
(function foo(a) {
    alert(a);
})(a);
您可以通过是否将某个对象用作所谓的右值来判断它是函数声明还是函数表达式;也就是说,它是否被赋值、传递到函数中、是否应用了运算符(在开始时)等等

下面是一个函数声明:

function foo() {
}
下面是一个命名函数表达式(最好在

(注意我们如何立即使用该值,将函数分配给
f

…下面是一个匿名函数表达式:

var f = function() {
};

他们很可能调用的函数什么都不做。这是实际的代码吗?如果它是函数表达式,它会调用函数,但它是一个函数语句,所以最后一行只返回
a
,就像
a;
一行单独返回一样。@Utkanos不,不是,因为IIFEs是函数表达式,而不是function statements.lonesomeday是对的,这不是一个生命。但这不是一个语法错误。它是完全有效的Javascript,不会做任何事情。@lonesomeday:oooooh,你是对的!!当然!