JavaScript的箭头函数
原文:Arrow Functions in JavaScript
箭头函数可以让编写函数更简洁,但有一些语法上的奇怪之处。本文描述了有效的使用箭头函数所需要了解的知识。
为了解决传统函数一些常见的问题,箭头函数从ES6开始引入。但是由于一些场景箭头函数并不适用,因此仍要了解何时使用传统函数,何时使用箭头函数。
语法
出现=>
符号时,就代表这是一个箭头函数。有两种方式声明一个箭头函数:
1、不带花括号{}
。这种语法中,箭头函数有隐式的返回值。例如,如下箭头函数虽然没有return
关键字,但它会返回42。
1 | // 'getAnswer()` is an arrow function that returns 42 |
2、带花括号{}
。这种语法中,箭头函数不是隐式的返回。
1 | // 'getAnswer()` is an arrow function that returns 42 |
箭头函数返回一个对象字面量时,有一些麻烦:
1 | // 语法错误!JavaScript认为 `=>` 后的花括号是代码块,而非对象 |
不带花括号时,在箭头=>
右侧只能放一个表达式。直观的看,这意味着在“单行程序”中只能使用不带花括号的语法。可以使用三元操作符?:
、&&
和||
,但不能使用if
语句或分号。
1 | let answer = 42; |
参数
和普通函数一样,箭头函数可以接收0个或多个参数。除了只有一个参数的箭头函数,必须把参数名放在圆括号中,(param1, param2, param3) => {}
。
1 | // 如果箭头函数没有参数,必须带圆括号 `() =>` |
何时使用箭头函数?
箭头函数有两个主要的优势:
1、单行函数的隐式返回使代码更简洁
2、词法this。箭头函数中的this
与箭头函数外的this指向同一个对象。
例如,在setTimeout()
中调用一个类方法。如果不使用箭头函数,使用普通函数,this
不是MyClass
的实例。
1 | class MyClass { |
使用箭头函数,this
是MyClass
的一个实例。
1 | class MyClass { |
何时不使用箭头函数?
箭头函数很好用,而且很多情况箭头函数和普通函数都没问题。但在使用依赖this
的框架中,不能使用箭头函数。
例如,假设用箭头函数声明一个Vue方法,会无法访问Vue实例的name
属性,因为Vue无法设置this
。
1 | const Vue = require('vue'); |
还有一个常见的例子就是Mocha的timeout。在Mocha测试中使用箭头函数,无法正确的进行timemout测试。
1 | describe('MyFunction', () => { |
一般来说,不能向框架传递箭头函数,除非可以确定不用this
关键字。例如,在Vue方法、Mocha测试、React类方法或Mongoose模型方法中,不要使用箭头函数。可以在Vue方法、Mocha测试的内部使用箭头函数,但向Vue或Mocha输入的顶层函数不能是箭头函数。