函数表达式
来源:广州中睿信息技术有限公司官网
发布时间:2012/10/21 23:25:16 编辑:admin 阅读 385
ecma262(5.1Edition/June2011)中关于函数的定义:SyntaxFunctionDeclaration:functionIdentifier(FormalParameterLi

ecma 262 (5.1 Edition / June 2011)中关于函数的定义:

 

 

Syntax
FunctionDeclaration :
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
function Identifieropt( FormalParameterListopt) { FunctionBody }
FormalParameterList :
Identifier

 

FormalParameterList , Identifier

 

FunctionBody :

 

SourceElementsopt

 由此可见:ecma中对函数的定义分为两种,一是函数声明,一是函数表达式.

从函数表达式的产生式来看:Identifier(标识符)是可选项,这就导致了命名函数表达式和匿名函数表达式两种方式

说到这里,不得不提ecma规范中给出的一段备注,

NOTE

The Identifier in a FunctionExpression can be referenced from inside the FunctionExpression's FunctionBody to allow the function to call itself recursively. However, unlike in a FunctionDeclaration, the Identifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.

 意思是说,函数表达式中的标识符,既函数名可以被其表达式内部的函数体引用来完成递归调用,但是不像函数声明,命名函数表达式中的函数名不能从包含这个表达式的作用域引用,也不能影响该作用域。

 

也就是说命名函数表达式的函数名对表达式内部可见,而对表达式外部不可见。

e.g

1 var a=function b(){alert(b);}
2 a();//result: function b() { alert(b);}
3 b();//result: b is not defined 

 以上是firefox5.0下的测试结果,关于命名函数表达式的问题各个浏览器的js引擎表现不太一样,其他浏览器未必是此结果,所以最好是避免使用,不用就不会引入这些问题,也不必去把这些琐碎的兼容性问题搞得一清二楚,只要知道有这么回事,避免之就ok,如果真碰到了,临时查阅资料就ok,退一步说,没必要非要跟这些浏览器的不一致性较劲,这些问题会慢慢的随着浏览器的更新换代而解决,在这方面浪费时间不太划算。

 

参考资料:

Ecma 262 (5.1 Edition / June 2011)

 

备注:之前见过一篇关于这方面的译文,对各个浏览器的表现有较为详细的分析,现在貌似找不到原文及原译文了, 不过还能搜到一些转载的。


联系我们CONTACT 扫一扫
愿景:成为最专业的软件研发服务领航者
中睿信息技术有限公司 广州•深圳 Tel:020-38931912 务实 Pragmatic
广州:广州市天河区翰景路1号金星大厦18层中睿信息 Fax:020-38931912 专业 Professional
深圳:深圳市福田区车公庙有色金属大厦509~510 Tel:0755-25855012 诚信 Integrity
所有权声明:PMI, PMP, Project Management Professional, PMI-ACP, PMI-PBA和PMBOK是项目管理协会(Project Management Institute, Inc.)的注册标志。
版权所有:广州中睿信息技术有限公司 粤ICP备13082838号-2