箭头是使用=>语法的函数简写。它们在语法上类似于C#、Java 8和CoffeeScript中的相关特性。它们既支持语句块体,也支持返回表达式值的表达式体。与函数不同,箭头与其周围的代码共享相同的词汇this。
箭头函数
ES6 允许使用“箭头”(=>)定义函数。
var odds = evens.map(v => v + 1);
var nums = evens.map((v, i) => v + i);
var pairs = evens.map(v => ({even: v, odd: v + 1}));
nums.forEach(v => {
if (v % 5 === 0)
fives.push(v);
});
var bob = {
_name: "Bob",
_friends: [],
printFriends() {
this._friends.forEach(f =>
console.log(this._name + " knows " + f));
}
}
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回。
var sum = (num1, num2) => { return num1 + num2; }
使用注意点
箭头函数有几个使用注意点。
-
箭头函数没有自己的this对象。
-
不可以当作构造函数,也就是说,不可以对箭头函数使用new命令,否则会抛出一个错误。
-
不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
-
不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
上面四点中,最重要的是第一点。对于普通函数来说,内部的this指向函数运行时所在的对象,但是这一点对箭头函数不成立。它没有自己的this对象,内部的this就是定义时上层作用域中的this。也就是说,箭头函数内部的this指向是固定的,相比之下,普通函数的this指向是可变的。
不适用场景
由于箭头函数使得this
从“动态”变成“静态”,下面两个场合不应该使用箭头函数:
- 定义对象的方法,且该方法内部包括
this
- 需要动态
this
的时候,也不应使用箭头函数
另外,如果函数体很复杂,有许多行,或者函数内部有大量的读写操作,不单纯是为了计算值,这时也不应该使用箭头函数,而是要使用普通函数,这样可以提高代码可读性。