匿名函数作为参数在JavaScript是很常见的,事件绑定、异步回调等都会用到匿名函数。ES6中引入了箭头函数,用于便捷地书写匿名函数。大致语法为:(参数) => {表达式或返回值}
,接下来让我们来看看箭头函数的用法。
语法
只有一个参数时,可以省略参数的括号:
a => a * 2
// 等价于:
function (a) {
return a * 2;
}
没有参数或多个参数时,括号不能省略:
() => true
// 等价于:
function () {
return true;
}
(a, b) => a + b
// 等价于:
function (a, b) {
return a + b;
}
上述例子中由于返回值仅为一句表达式,这样可以把{...}
和return
都省略掉了。如果函数较为复杂,那么还是需要{...}
和return
的:
$('button').click(event => {
doSomething();
doSomethingElse();
});
// 等价于:
$('button').click(function(event) {
doSomething();
doSomethingElse();
});
当返回值仅为一句表达式且是一个对象时,需要用()
将对象的括号包括进去:
a => ({})
// 等价于
function (a) {
return {};
}
this
和普通的匿名函数不同,箭头函数的this
指向的是函数所处的上下文环境。看下面的例子:
var Person = function(name) {
this.name = name;
this.sayNameAfterTwoSeconds = function() {
var me = this;
setTimeout(function() {
alert(me.name);
}, 2000);
}
};
var john = new Person('John');
john.sayNameAfterTwoSeconds();
以前,由于setTimeout
的调用者为window
,那么其内部的匿名函数的this
指向了window
,所以我们往往需要通过定义var me = this
来将正确的this
传入匿名函数。使用箭头函数就可以完美解决这一问题:
var Person = function(name) {
this.name = name;
this.sayNameAfterTwoSeconds = function() {
setTimeout(() => {
alert(this.name)
}, 2000);
};
};
var john = new Person('john');
john.sayNameAfterTwoSeconds();