JavaScript function expression vs function declaration

在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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值