今天落叶同学发我一篇文章,我看到一个"新"名词 "函数字面量" (也可叫直接量),当时我就郁闷了,这是什么东西? 我怎么没听说过。。
回头翻了下权威指南,在第 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 是把双刃剑,是性能杀手,能避免就尽量避免使用。
加一个函数名,调用方便,性能极致,对项目压缩也有好处,何乐而不为呢?

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

js拾遗: 函数字面量的更多相关文章

  1. Scala函数字面量简化写法

    Scala提供了多种方法来简化函数字面量中多余的部分,比如前面例子中filter方法中使用的函数字面量,完整的写法如下: (x :Int ) => x +1 首先可以省略到参数的类型,Scala ...

  2. Scala函数字面量

    Scala中函数为头等公民,你不仅可以定义一个函数然后调用它,而且你可以写一个未命名的函数字面量,然后可以把它当成一个值传递到其它函数或是赋值给其它变量.下面的例子为一个简单的函数字面量(参考整数字面 ...

  3. Scala 基础(7)—— 函数字面量和一等函数

    1. 函数字面量 在 Scala 基础(3)—— 基础类型和基础操作 中提到了函数字面量,这里具体解释函数字面量的语法. 下面展示一个具体的函数字面量,它由三部分组成: (x: Int, y: Int ...

  4. js中对象字面量

    一.对象字面量语法 var person={ name:'小王', age:18, _pri:233 } 成员名称的单引号不是必须的 最后一个成员结尾不要用逗号,不然在某些浏览器中会抛出错误 成员名相 ...

  5. JS基础_字面量和变量

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. JS基础二--字面量和变量

       /*       字面量,都是一些不可改变的值,       比如:1 2 3 4 5       字面量都是可以直接使用,但是我们一般不会直接使用字面量.       变量,变量可以用来保存字 ...

  7. 简写函数字面量(function literal)

    如果函数的参数在函数体内只出现一次,则可以使用下划线代替: val f1 = (_: Int) + (_: Int) //等价于 val f2 = (x: Int, y: Int) => x + ...

  8. js字面量

    以前一直对js字面量模棱两可. '字面量是一种表示值的记法.' js字面量(literal) 分为以下几个 number literal        8   就是数字字面量 string liter ...

  9. Js里头的对象字面量

    JavaScript 对象字面量 在编程语言中,字面量是一种表示值的记法.例如,"Hello, World!" 在许多语言中都表示一个字符串字面量(string literal ) ...

随机推荐

  1. Theory And Practice

    实践出真知,建议不要一味地看Backbone源码和网上解析,自己动手实践吧少年们! 我是一个简单的简直无可救药的小栗子~ ——Silun Wang 我的几个小问题: 1. Rocket介绍没有Todo ...

  2. Notes of Daily Scrum Meeting(12.3)

    这个月大家的课业任务很重啊,加上软工有三个课程设计要完成了,感觉亚历山大的说,而且我们alpha阶段完成度低一些, 所以任务更多了,今天做的东西就不多,希望大家加油吧! 团队成员 今日团队工作 陈少杰 ...

  3. Linux内核分析作业第二周

    操作系统是如何工作的 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.函数调用堆栈 1.计算机工作三 ...

  4. Java Socket 多线程聊天室

    本来这次作业我是想搞个图形界面的,然而现实情况是我把题意理解错了,于是乎失去了最初的兴致,还是把程序变成了功能正确但是“UI”不友好的console了,但是不管怎么样,前期的图形界面的开发还是很有收获 ...

  5. 团队作业5——英语学习/词典App行业Top5

    来自权威研究机构易观智库的最新数据表明,国内几家主流词典类App市场的份额占比差异化分布进一步加剧. 对于156万安卓移动端活跃数字消费者的移动互联网行为监测结果显示,截至2014年8月底,有道词典A ...

  6. JS基础(五)自定义函数

    作用:是为了让重复使用的语句,方便进行调用. 定义格式: function 自定义函数名 (参数1, 参数2,...) { 执行的语句 } 函数的封装:把语句放到函数中去的过程. 参数:通过参数的改变 ...

  7. linux 取消控制台报警音

    可以通过setterm -blength 0 设置报警音报警时间,0表示没有报警音 也可以通过setterm -bfreq 10 设置报警音的频率(Hz) 如果通过命令行直接设置,当下会生效,但是重启 ...

  8. Nginx upstream 配置

    1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.例如:u ...

  9. MongoDB高级操作(2)

    查询方法-常用查询方法 查询多条数据 --db.集合名称.find({条件文档}) 查询一条数据 --db.集合名称.findOne({条件文档}) 结果格式化 --pretty()方法 --db.集 ...

  10. Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies

    my shurufa  huai diao le 1\ first   you need  install     " SQLSysClrTypes_x86.msi  " 2\   ...