购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2

箭头函数
(Arrow Function)

除let和const之外,箭头函数是使用率最高的新特性了。当然了,如果你了解过Scala或者曾经如日中天的JavaScript衍生语言CoffeeScript,就会知道箭头函数并非ES2015 独创。在CoffeeScript中它叫作“胖箭头”,在Scala中这便是函数的基本定义形式。

箭头函数,顾名思义便是使用箭头(=>)进行定义的函数,属于匿名函数(AnonymousFunction)一类。当然了,它也可以作为定义式函数使用,但我们并不推荐这样做,随后会详细解释。 mdVR5XlbFLI7t6+5VnGipdNthw+REpxFXtM1V+9p2QciqL9k+O7x47+IUiDXhGZR



3.2.1 使用语法

箭头函数有四种使用语法。

3.2.1.1 单一参数的单行箭头函数

这是箭头函数最简洁的形式,常见于用作简单的处理函数,如过滤。

3.2.1.2 多参数的单行箭头函数

在大多数情况下,函数都不会只有一个参数传入,在箭头函数中,多参数的语法跟普通函数一样,以括号来包裹参数列。这种形式常见于数组的处理,如排序。

3.2.1.3 多行箭头函数

3.2.1.4 无参数箭头函数

如果一个箭头函数无参数传入,则需要用一对空的括号来表示空的参数列表。

以上都是被支持的箭头函数表达方式,其最大的好处便是简洁明了,省略了function关键字,而使用 => 代替。相对于传统的function语句,箭头函数在简单的函数使用中更为简洁直观。

箭头函数语言简洁的特点使其特别适合用于单行回调函数的定义。

在ECMAScript这种同时具有函数式编程和面对对象编程特点的编程语言中,箭头函数可以让代码在编写上变得非常直观和易懂。

1.将原本的由名字组成的数组转换为一个格式为{ id, name }的对象,id则为每个名字在原数组中的位置。

2.剔除其中id为奇数的元素,只保留id为偶数的元素。

3.将剩下的元素转换为一个包含当前元素中原名字的单元数组,以方便下一步的处理。

4.不断合并相邻的两个数组,最后得到的一个数组,便是我们需要得到的目标值。 mdVR5XlbFLI7t6+5VnGipdNthw+REpxFXtM1V+9p2QciqL9k+O7x47+IUiDXhGZR



3.2.2 this穿透

事实上,箭头函数在ES2015 标准中,并不只是作为一种简单的语法糖出现。就如同它在CoffeeScript中的定义一般,是用于将函数内部的this延伸至上一层作用域中,即上一层的上下文会穿透到内层的箭头函数中,我们可以以一段代码来简单解释。

如果用Babel等ES2015 编译工具来将其转换为ES5 的代码,其中的obj.foo函数如下。

为什么要赋予箭头函数这样的特性呢?我们可以假设出这样的一个应用场景,我们需要创建一个实例,用于对一些数据进行查询和筛选。

此时,从服务器获得数据是一个JSON 编码的数组,其中包含的元素是若干元素的ID,我们需要另外请求服务器的其他API以获得元素本身(当然了,实际上的API设计大部分不会这么使用这种设计)。这样就需要在回调函数中再次使用this.baseUrl这个属性,如果要同时兼顾代码的可阅读性和美观性,ES2015 允许我们这样做(配合Promise以展示箭头函数的简洁性,我们将在本章节中详细讨论Promise)。

因为在单行匿名函数中,如果this指向的是该函数的上下文,就会不符合直观的语义表达。

3.2.2.1 程序逻辑注意事项

箭头函数对上下文的绑定是强制性的,无法通过apply或call方法改变。

因为箭头函数绑定上下文的特性,故不能随意在顶层作用域使用箭头函数,以防出现下面的错误。

为什么上面这段代码会如此让人费解呢?我们来看看它的等价代码吧。

同样地,在箭头函数中也没有arguments、callee甚至caller等对象。

如果有使用arguments 的需求,可以使用后续参数来取得参数列表,我们将在下面的章节中详细讲解。

3.2.2.2 编写语法注意事项

ES2015 提供了多行的箭头函数语法,所以在使用单行箭头函数时,请不要对单行的函数体做任何换行,以免出现语法错误。

参数列表的右括弧、箭头需要保持在同一行内。

单行箭头函数只能包含一条语句。但如果是错误抛出语句(throw)等非表达式的语句,则需要使用花括号包裹。

若要使用单行箭头函数直接返回一个对象字面量,请使用一个括号包裹该对象字面量,而不是直接使用大括号,否则ECMAScript解析引擎会将其解析为一个多行箭头函数。 mdVR5XlbFLI7t6+5VnGipdNthw+REpxFXtM1V+9p2QciqL9k+O7x47+IUiDXhGZR

点击中间区域
呼出菜单
上一章
目录
下一章
×