探索ES6:箭头函数
2017年2月17日

匿名函数作为参数在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();

分类

JavaScript ES6