在Javascript中创建function有两种方式:function expression 和function declaration。它们的定义分别是:
FunctionDeclaration:
FunctionIdentifier(formatParameterListOpt) { FunctionBody}
FunctionExpression:
Function IdentifierOpt(formatParameterListOpt){FunctionBody}
从它们的定义来看,唯一的区别是identifier是否是optional。如果identifier出现了,我们该如何区分它们呢?ECMAScript通过如下的方式来区分它们,如果function foo(){}是一个赋值表达式,此时是function expression。而functionfoo(){}在一个函数体内或者在程序中,此时是function declaration。
function foo(){} // declaration, since it is part of a program
var bar=function foo(){};// expression, since it is part of an assignmentExpression
new function bar(){}; // expression, since it is part of NewExpression
(function() {
function bar(){} // declaration, since it is part of FunctionBody
})();
有一种特殊的情况是:当函数被小括号(grouping operator)包装的时候,此时作为function expression
function foo(){} // function declaration
(function foo(){}); // function expression, due to grouping operator
当然,function declaration与function expression还是有区别的。
1. functiondeclaration hoisting: 函数declaration在其它表达式之前被解释以及执行。
alert(fn()); // output: hello JavaScript
function fn() {
return'hello JavaScript';
}
2. functiondeclaration在block { …}中,尤其是if,while,for表达式里的行为是未定义的,never do it.
//never do it
// some browser will declare `foo` as the one returning ‘first’
// while others returning ‘second’
if (true){
function foo(){
return ‘first’;
}
}else{
function foo(){
return ‘second’;
}
}
// Instead, use function expression
var foo;
if (true){
foo = function(){
return ‘first’;
};
}else {
foo = function() {
return ‘second’;
}
}
当function declaration有名字(即identifier),曰named function expression,如var bar = function foo(){}; foo是函数名,需要注意的是foo的scope
var f = function foo(){
return typeof foo; // foo is available in this inner scope
}
// foo is never visible outside
typeof foo; // undefined
f(); // function