箭头函数是 ES6 中引入的新特性,它使我们在编写函数表达式的语法更加简洁。虽然普通函数和箭头函数的工作方式类似,但是它们之间还是存在一些差异。
语法
// ES5
var add = function(x, y) {
return x + y;
};
// ES6
let add = (x, y) => { return x + y };
从上面箭头函数的例子可以看出,箭头函数允许开发人员以更少的代码来完成普通函数相同的功能。
如果花括号内只有一个表达式,我们甚至可以将花括号省去。上面例子可以改写为:
let add = (x, y) => x + y;
如果函数只接收一个参数的话,我们甚至可以将括号省去:
let squareNum = x => x * x
如果函数不需要参数的话:
let log = _ => console.log('log')
参数差异
箭头函数没有 arguments
绑定。但是,箭头函数可以访问最近的非箭头函数的 arguments
对象。
普通函数使用:
let myFunc = {
showArgs() {
console.log(arguments)
}
}
myFunc.showArgs(1, 2, 3)
运行结果:
箭头函数:
let myFunc = {
showArgs: () => {
console.log(arguments)
}
}
myFunc.showArgs(1, 2, 3)
运行结果:
this 作用域
不像普通函数,箭头函数没有自己的 this
。箭头函数中 this
的值在箭头函数的生命周期中是保持不变的,并且始终与最近的非箭头函数中 this
的值绑定。
let me = {
name: "张三",
thisInArrow:() => {
console.log("My name is " + this.name); // no 'this' binding here
},
thisInRegular(){
console.log("My name is " + this.name); // 'this' binding works here
}
};
me.thisInArrow();
me.thisInRegular();
运行结果如下:
new 关键字
使用函数声明或者表达式创建的函数是可以被构造的。由于常规函数是可构造的,因此可以使用 new
关键字调用。
但是,箭头函数只能被调用不能被构造,即箭头函数永远不能当中构造函数使用。因此,永远不能使用 new
关键字调用。
let add = (x, y) => console.log(x + y)
new add(2, 3)
没有重复命名的参数
箭头函数永远不能有重复命名的参数,不论是严格或者非严格模式。
这意味着下面的代码是合理的:
function add(x, x) {}
但是在严格模式下是非法的:
'use strict'
function add(x, x) {}
箭头函数不论在严格模式和非严格模式重复命名都是无效的。
(x, x) => {}