箭头函数,ES6标准新增的一种函数语法。
定义方式如下:
let func1 = a => a * 2; // 单参数
let func2 = (a, b) => a + b; // 双参数
let func3 = a => ({value: a});// 返回对象
let func4 = a => { // 包含函数体
console.log(a);
return a*2;
}
箭头函数与普通函数的区别
1、this值
每个新定义的普通函数都有一个自己的this值,例如:
var obj = {
value: 0,
func: function () {
return function () {
this.value += 1;
}
}
}
console.log(obj.value); // 0
obj.func()();
console.log(obj.value); // 0
在ES5中,可以使用一个变量来传递this,例如:
var obj = {
value: 0,
func: function () {
var that = this;
return function () {
this.value += 1;
}
}
}
也可以使用bind函数来将this值传递给目标函数,例如:
var obj = {
value: 0,
func: function () {
return function () {
this.value += 1;
}
}.bind(this);
}
而箭头函数会自动捕获上下文中的this值作为自身的this值,如:
var obj = {
value: 0,
func: function () {
return function () {
this.value += 1;
}
}
}
console.log(obj.value); // 0
obj.func()();
console.log(obj.value); // 1
2、获取传递参数数组
普通函数使用arguments获取传入的参数数组,而箭头函数使用与PHP中一样的形式:...args来获取参数数组,如:
var a = function () {
console.log(arguments);
}
var b = () => {
console.log(arguments);
}
var c = function (...agrs) {
console.log(args);
}
var d = (...args) => {
console.log(args);
}
a(1,2,3,4,5); // [Arguments] { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
b(1,2,3,4,5); // 输出相关环境信息
c(1,2,3,4,5); // 报错
d(1,2,3,4,5); // [ 1, 2, 3, 4, 5 ]
3、构造器
箭头函数不能用于构造器,所以不能使用new来创建实例,如:
let A = function () {
this.value = "A";
}
let B = () => {
this.value = "B";
}
let a = new A();
console.log(a.value); // A
let b= new B(); // 报错
console.log(b.value);
4、原型属性
箭头函数没有原型属性
5、作为对象方法出现
当作为对象的方法出现时,没有定义this绑定。如:
var obj = {
value: 1,
printValue: () => {
console.log(this.obj.value);
},
printValue2: function () {
console.log(this.value);
}
};
obj.printValue(); // undefined
obj.printValue2(); // 1