JavaScript 中的函数有两种类型——声明和表达式。
这是两者之间的区别:
- 函数声明被提升。这意味着您可以在函数出现在程序中之前调用它,因为 JavaScript 中的声明被提升了。
- 可以立即调用函数表达式。函数声明不能。这是因为表达式表达(或返回值)。函数表达式表达一个函数。
函数声明示例:
foo("bar");
function foo(bar) {
alert("foo" + bar);
}
上面的程序可以工作,因为foo
它是一个函数声明。
foo("bar"); // throws an error, foo is undefined - not a function
var foo = function (bar) {
alert("foo" + bar);
};
上面的程序不能像foo
声明的那样工作undefined
,提升,然后分配一个函数表达式的值。因此,undefined
当它被调用时。
函数表达式示例:
(function (bar) {
alert("foo" + bar);
}("bar"));
上面的函数将立即被调用,因为它是一个函数表达式。
function (bar) {
alert("foo" + bar);
}("bar"); // throws an error, can't call undefined
上面的函数不会立即被调用,因为它是一个函数声明。请记住,声明不表达(或返回值)。所以这就像试图undefined
作为一个函数来调用。
函数如何变成表达式?
如果在预期表达式的上下文中使用函数,则将其视为表达式。否则,它被视为声明。
在以下情况下需要表达式:
- 您正在为变量赋值(即
identifier = expression
)。
- 括号内(即
( expression )
)。
- 作为运算符的操作数(即
operator expression
)。
因此,以下都是函数表达式:
var foo = function () {};
(function () {});
~function () {};
其他一切都是函数声明。简而言之,如果您的函数前面没有任何内容,那么它就是一个声明。
请参阅此代码:https ://github.com/aaditmshah/codemirror-repl/blob/master/scripts/index.js#L94
以下函数isExpression
用于测试一些任意 JavaScript 代码是否为表达式:
function isExpression(code) {
if (/^\s*function\s/.test(code)) return false;
try {
Function("return " + code);
return true;
} catch (error) {
return false;
}
}
希望这可以消除您心中的任何疑问。
简而言之:
- 函数表达式表示或返回一个值(在本例中为函数)。因此它可以立即被调用,但在它出现在程序中之前不能被调用。
- 函数声明被提升。因此它可以在它出现在程序中之前被调用。然而,由于它不表达任何价值,它不能立即被调用。