今天落叶同学发我一篇文章,我看到一个"新"名词 "函数字面量" (也可叫直接量),当时我就郁闷了,这是什么东西? 我怎么没听说过。。
回头翻了下权威指南,在第 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. shellcode 编码技术

    在很多漏洞利用场景中, shellcode 的内容将会受到限制. 例如你不能输入 \x00 这个字符,编辑框不能输入 \x0d \x0a这样的字符 所以需要完成 shellcode 的逻辑,然后使用编 ...

  2. tcp ,http .udp

    三次握手,四次挥手要知道,记住. 计算机协议常见面试题,学会了,记住.会运用.

  3. PAT甲题题解-1061. Dating (20)-字符串处理,水水

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  4. “数学口袋精灵”第二个Sprint计划(第四天)

    “数学口袋精灵”第二个Sprint计划----第四天进度 任务分配: 冯美欣:欢迎界面的背景音乐完善 吴舒婷:游戏界面的动作条,选择答案后的音效 林欢雯:代码算法设计 进度:   冯美欣:欢迎界面背景 ...

  5. time since epoch

    C++11 提供了新的获取系统时间的库函数,在获取时间的时候一般常用的是获取time since epoch,下面来看一下如何获取这个时间. #include <iostream> #in ...

  6. Python日志模块简单使用

    def loginfo(info): # create logger logger = logging.getLogger('[cpu and mem]**********') # Set defau ...

  7. CI框架 default_controller 如何设置为:'目录/Controller' 转

    闲谈 前几天,我的室友发现了一个问题:CI框架的Router.php文件的default_controller设置为application\controllers文件下的 一级PHP文件名 就可以,设 ...

  8. Docker(五)-Dcoker容器

    简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境. 如果把镜像看成面向对象中的 类 的话,那么容器就是 类 的实例化 对象. 容器 启动容器 启动容器有两种方式,一种是基于镜像新建一个容 ...

  9. Win2008r2 由ESXi 转换到 HyperV的处理过程

    1. 大部分2008r2 采取了 windows loader的方式激活 这种方式 会导致hyperV 启动失败 因为他家在了错误的bios类型 所以第一步建议 使用windows loader 卸载 ...

  10. [财务知识]IFRS9

    浅谈IFRS9 2018-07-10 23:15信用/收益 原创申明 本文原创作者为金融监管研究院助理研究员李健,未经授权谢绝转载.引用.抄袭. 引言 2018年6月6日,财政部会计司发布了“关于就& ...