在声明函数(最后一行)后,括号正在做什么?
var a = 0;
function foo(a) {
alert(a);
} (a);
Run Code Online (Sandbox Code Playgroud)
该代码看起来有点棘手,因为它声明了一个变量,为它赋值,声明了一个函数(发生在前面,但它在代码中是第三个),然后有一个表达式什么都不做.让我们分解一下:
首先,它声明变量a并分配0给它:
var a = 0;
Run Code Online (Sandbox Code Playgroud)
然后它声明一个函数:
function foo(a) {
alert(a);
}
Run Code Online (Sandbox Code Playgroud)
然后它有这个表达式,它什么都不做:
(a);
Run Code Online (Sandbox Code Playgroud)
这里的关键是函数声明是一个声明,而不是一个表达式,因此(a)它后面的那个不适用于它.JavaScript具有函数声明和函数表达式.函数声明总是有一个函数名; 函数表达式可以是命名的或匿名的.
如果我们稍微更改代码,我们可以使它成为一个函数表达式,这意味着(a)将调用该函数:
var a = 0;
(function foo(a) {
alert(a);
})(a);
Run Code Online (Sandbox Code Playgroud)
开口(把解析器在它期望的表达模式,这改变函数声明成一个函数表达(具体地,一个命名的一个).这意味着我们可以立即调用该函数(a).
有很多方法可以将解析器放到需要表达式的模式中,而parens只是一种方式.您也可以使用任何一元运算符:
var a = 0;
(function foo(a) {
alert(a);
})(a);
Run Code Online (Sandbox Code Playgroud)
你可以通过它是否被用作所谓的右手值来判断某些东西是函数声明还是函数表达式; 是,它被分配给某个东西,传递给一个函数,有一个运算符应用于它(在开头),等等.
这是一个函数声明:
function foo() {
}
Run Code Online (Sandbox Code Playgroud)
var f = function foo() {
};
Run Code Online (Sandbox Code Playgroud)
(注意我们如何立即使用该值,将函数分配给f)
......这是一个匿名函数表达式:
var f = function() {
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |