箭头函数是用JavaScript编写函数的一种相对较新的方式。它们是由ECMAScript 6规范引入的,从那以后成为最流行的ES6特性。箭头函数允许你用箭头符号快速定义JavaScript函数。它最大的优点是,在创建新的JavaScript函数时,可以省略花括号和function关键字以及return关键字。

这种语法起初可能看起来很奇怪,但值得掌握。箭头函数不仅节省时间,还能写出更易读的代码。许多JavaScript工程师已经习惯每天都用它了。

它的基本句法如下所示:

在本文中,我们将使用一些真实的例子,看看如何在不同的场景中创建箭头函数。我们还将使用旧的ECMAScript 5语法来编写相同功能的代码,这样你可以了解二者之间的区别。

没有参数

没有参数

最简单的箭头函数句法是函数没有任何参数。在下面的示例中,用ECMAScript 5语法声明了一个函数表达式,并将其赋给 birthday 变量。它向控制台输出一个简单的字符串,“Happy birthday!”。

在箭头函数语法中,花括号、function和 return 关键字都消失了。现在,整个函数只需要一行代码。空括号表示函数没有任何参数,箭头后面就是函数体。

一个参数

一个参数

我们修改上面的例子,为函数增加一个参数,名为 name。旧版 ES5 语法会取得一个参数,然后将其追加到返回的字符串中:

箭头函数语法本质上做了同样的事情。你需要将name参数括在箭头之前的括号中,然后在函数体中省略return关键字:

两个参数

两个参数

你可以在箭头函数里带上任意多的参数。例如,还是以 birthday 为例,它有两个参数,age 和 name。现在,birthday()函数需要两个参数来返回字符串。首先,我们使用ECMAScript 5语法:

然后,这是 ES6 的版本实现相同的功能:

如果函数声明太长或占用多行,也可以用花括号将它括起来,如下所示。不过,当你这样做的时候,也必须把return关键字添加到函数体中。

条件语句

条件语句

当你想要在函数体中使用条件语句时,箭头函数也是一个不错的选择。下面的脚本定义了一个简单的开关,其中 state 参数指示开关是打开还是关闭。

由于 if-else 语句占用了多行,你需要在每个代码块中使用 return 关键字。除此之外,和上面的写法没有什么不同:

对象字面量

对象字面量

你还可以使用箭头函数语法来声明setter函数,让用户设置对象字面量的值。下面的setBirthday()函数允许用户设置寿星的姓名和年龄:

使用箭头函数句法,只需要一行代码即可实现同样的功能:

数组操作

数组操作

你也可以使用箭头函数来操作JavaScript数组。例如,让我们看一下persons数组,它包含三个对象字面量,每个对象都有一个 name 和 age 属性:

JavaScript内置的map() 方法允许你在数组的每个元素上调用相同的函数。使用传统的ES5语法,你可以通过以下方式返回每个人的 name 属性:

使用箭头函数句法,只需要一行代码即可实现同样的操作:

何时不要使用箭头函数

何时不要使用箭头函数

虽然箭头函数有许多使用场景,但是它们也有一些限制。有些情况下,你不能或不应该使用箭头函数语法。

最重要的是,不能用箭头函数创建构造函数。如果使用 new 关键字和箭头函数,控制台将抛出一个错误。这是因为JavaScript把箭头函数看作类似于对象的方法。因此,箭头函数不能拥有自己的方法。

此外,箭头函数没有自己的 this,它总是使用外层包裹它的作用域所用的 this。如果对象字面量中的函数需要访问此对象的属性,这个函数也不要使用箭头函数。

总结

总结

箭头函数为开发者用JavaScript编写函数时提供了一种快捷方法。箭头语法有许多使用场景,因此它很快就成为了JavaScript社区最喜欢的ES6特性。如果使用恰当,这种紧凑的语法可以节省大量的开发时间和带宽,并提高代码的可读性。