在声明函数(最后一行)后,括号正在做什么?
var a = 0;
function foo(a) {
alert(a);
} (a);
答案 0 :(得分:7)
该代码看起来有点棘手,因为它声明了一个变量,赋予它一个值,声明一个函数(先前发生,但它在代码中是第三个),然后有一个表达式没有。让我们分解一下:
首先,它声明变量a
并为其指定0
:
var a = 0;
然后它声明了一个函数:
function foo(a) {
alert(a);
}
然后它有这个表达式,它什么都不做:
(a);
这里的关键是函数声明是声明,而不是表达式,因此它后面的(a)
不适用于它。 JavaScript具有函数声明和函数表达式。函数声明总是有一个函数名;函数表达式可以命名或匿名。
如果我们稍微更改代码 ,我们可以将其设为函数表达式,这意味着(a)
将调用该函数:
var a = 0;
(function foo(a) {
alert(a);
})(a);
开头(
将解析器置于一种模式,在该模式中它需要一个表达式,它将函数声明更改为函数表达式(特别是命名的)。这意味着我们可以通过将(a)
放在它之后立即调用该函数。
有很多方法可以将解析器放入需要表达式的模式,parens只是一种方式。您也可以使用任何一元运算符:
var a = 0;
(function foo(a) {
alert(a);
})(a);
你可以通过它是否被用作所谓的右手值来判断某些东西是函数声明还是函数表达式;也就是说,它被分配给某个东西,传递给一个函数,一个运算符应用于它(在开头)等等。
这是一个函数声明:
function foo() {
}
这是一个命名函数表达式(最好avoid on IE8及更早版本)
var f = function foo() {
};
(请注意我们如何立即使用该值,将该功能分配给f
)
...这里是一个匿名函数表达式:
var f = function() {
};