js拾遗: 函数字面量

今天落叶同学发我一篇文章,我看到一个"新"名词 "函数字面量" (也可叫直接量),当时我就郁闷了,这是什么东西? 我怎么没听说过。。
回头翻了下权威指南,在第 4.3 章节中可以看到:从某种意义上讲,函数定义表达式可称之为 "函数直接量"。
看样子有必要重新仔细看看权威指南了,我已经发现好多细节问题都被忽略了。

不过在 函数字面量 定义的问题上,我们发生了一点分歧,他认为匿名函数叫做函数字面量才更准确,而我则认为,函数表达式即函数字面量。
于是我各种百度谷歌(百度这个狗屎,根本找不到这东西)。
其实我的习惯是去 MDN 找的,但是没找到,所以无奈谷歌之。。
找到一个还算不错的文档: 4.2. Function Literal

我就不做翻译了,简单说下文章所表达的意思。
函数字面量由4部分组成。
第一部分,关键词 function
第二部分,函数名,但是可有可无。
第三部分,包含在括号内的参数,当然参数也是可有可无的,括号不能少。
第四部分,是一组包裹在大括号的语句块,也就是函数要执行的具体代码,当然不写代码也没问题,{} 是必须要的。

乍一看,这个不就是函数的定义么,怎么说是函数字面量呢?
其实,之前我们就说了一个限定条件,函数表达式。
当函数做为表达式的时候,可以分成这四部分。

第二部分,函数名,但是可有可无。
如果是函数声明,少了函数名会报错的。
所以说函数表达式才是这里所说的函数字面量。

例如

function () {}

这个写法符合上面4条,但却不是表达式,运行会报语法错误。
只有当作表达式的时候才能正常执行。

(function () {});
var a = function () {};
var obj = {fn: function () {}};

这样写都没问题。。

再来看个

var fn = function test() {};

这个是函数声明吗?
这个也是函数字面量,test 是这个函数的名字,但是在这里只对函数体内可见,外部是不可调用的。
来看个测试 (点击右侧 运行 即可查看结果)

var fn = function test() { console.log(test); };
console.log(fn);
fn();
console.log(test); // 报 test 未定义

这里的函数名可用于内部使用,比如一些递归调用的时候,这样会很方便。
可能有人会说为什么不用 arguments.callee 呢。
很多地方都可以看到说 arguments 是把双刃剑,是性能杀手,能避免就尽量避免使用。
加一个函数名,调用方便,性能极致,对项目压缩也有好处,何乐而不为呢?

好了,今天的内容分享完毕,如有说的不对之处,还望回帖指教,小生先谢过了。。

posted @ 2014-06-10 21:05  楼教主  阅读(2460)  评论(6编辑  收藏  举报