功能有两种类型的JavaScript - 声明和表达式。
这是二者之间的差:
- 函数声明悬挂。这意味着您可以在程序出现之前调用该函数,因为在JavaScript中声明已悬挂。
- 函数表达式可以立即调用。函数声明不能。这是因为表达式表示(或返回一个值)。函数表达式表示一个函数。
函数声明的一个例子:
foo("bar");
function foo(bar) {
alert("foo" + bar);
}
上述方案将工作,因为foo
是一个函数声明。如foo
被声明为undefined
,悬挂再后来分配一个函数表达式的值
foo("bar"); // throws an error, foo is undefined - not a function
var foo = function (bar) {
alert("foo" + bar);
};
上述程序将不工作。当它被调用时它是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;
}
}
希望这将清除在你的心中有任何怀疑。
简而言之:
- 函数表达式表达或返回一个值(在这种情况下的函数)。因此可以立即调用,但在程序出现之前无法调用它。
- 函数声明是的悬挂。因此可以在程序出现之前调用它。但由于它不表示任何价值,因此不能立即调用。
[函数声明](http://ecma-international.org/ecma-262/5.1/#sec-13)都不是函数表达式。 – RobG 2013-02-22 11:53:21
没有区别。 – 2013-02-22 11:53:24
通常第二个需要首先通过'person()'实例化,但也许在运行时环境中存在一个错误。 – 2013-02-22 11:54:13