JavaScript function expression vs function declaration

来源:互联网 发布:qq五笔for mac下载 编辑:程序博客网 时间:2024/06/02 13:12

在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 programvar bar=function foo(){};// expression, since it is part of an assignmentExpressionnew 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 JavaScriptfunction 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 expressionvar 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 outsidetypeof foo; // undefinedf(); // function




0 0
原创粉丝点击