
3.2 箭头函数
箭头函数也被称为胖箭头(一般称->为瘦箭头,而称=>为胖箭头)函数或lambda函数(来自其他语言)。一个较常用的箭头函数的特性是()=>something。设计箭头函数的主要目的如下。
● 你不再需要书写function。
● 从词义上说,它包含了this的意义。
● 从词义上说,它包含了argument的意义。
对于一个自称函数式的语言来说,在JavaScript中,你书写了太多的function,而胖箭头函数能让你很容易地创建一个函数。

this一直是JavaScript的一个痛点。一位智者曾经说过:我讨厌JavaScript,因为它太容易丢失this的意义。胖箭头函数通过使用捕获上下文的this的意义的方式,修复了此问题,例如下面这个纯JavaScript类。

如果在浏览器中运行这段代码,函数中的this将会指向window,因为window将执行函数growOld,可以使用箭头函数来修复它。

这里能正常工作的原因是,箭头函数从函数体外部捕获到了this的引用。这等价于下面这段代码(如果你没使用TypeScript,也可以自己写)。

注意:如果使用TypeScript,你可以使用箭头函数和类,以让你的代码语法更简洁。

1.箭头函数的用处
除了语法简洁,如果你计划把函数交给其他人调用,使用箭头函数也会非常有效。

如果你想自己调用一个箭头函数,示例如下。

this将拥有正确的上下文,如这个例子中的person。
2.箭头函数是危险的
事实上,如果你想让this成为调用时的上下文,你并不应该使用箭头函数。你应该像jQuery、Underscore、Mocha及其他库那样使用回调函数。如果文档提及有关this的功能,那么你应该使用一个普通函数而不是箭头函数。与此相似,如果你准备使用arguments关键字,那么也不应该使用箭头函数。
3.箭头函数和使用this的库
很多库使用this,例如jQuery迭代器会使用this向你传递正在迭代的对象。这样的话,如果你想通过this访问该库及使用时的上下文,只需要使用像_self这样的临时变量即可,示例如下。

4.箭头函数和继承
箭头函数作为类的属性可以很好地处理继承。

然而,当你尝试重写子类中的函数时,它们并不能使用super关键字。属性将会继续使用this调用。由于只有一个this,这样的函数不能参与对super的调用(super只适用于原型成员)。你可以通过在子类中重写此函数来轻松绕过这条规则。

5.快速返回对象
有时,你需要一个只返回简单对象字面量的函数,示例如下。

这会在JavaScript运行时被解析为包含JavaScript标签的块,这是由JavaScript规范导致的。
注意:如果这没有意义,不要担心,因为你从TypeScript的一个“未使用的标签”提示中得到了一个很好的编译器错误。标签是一个旧的(大多数时候是未使用的)JavaScript特性,你可以像对待一个现代的GOTO那样去忽略它(经验丰富的开发人员认为它很糟糕)。
可以用()包围对象字面量的方式来修复它。

