this

    箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的 this 是词法作用域,由上下文确定。

    回顾前面的例子,由于JavaScript函数对 this 绑定的错误处理,下面的例子无法得到预期结果:

    var obj = {

    birth: 1990,

    getAge: function () {

    var b = this.birth; // 1990

    var fn = function () {

    return new Date().getFullYear() - this.birth; // this指向window或undefined

    };

    return fn();

    }

    };

    现在,箭头函数完全修复了 this 的指向, this 总是指向词法作用域,也就是外层调用者 obj

    var obj = {

    birth: 1990,

    getAge: function () {

    var b = this.birth; // 1990

    var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象

    return fn();

    }

    };

    obj.getAge(); // 25

    如果使用箭头函数,以前的那种hack写法:

    var that = this;

    就不再需要了。

    由于 this 在箭头函数中已经按照词法作用域绑定了,所以,用 call() 或者 apply() 调用箭头函数时,无法对 this 进行绑定,即传入的第一个参数被忽略:

    var obj = {

    birth: 1990,

    getAge: function (year) {

    var b = this.birth; // 1990

    var fn = (y) => y - this.birth; // this.birth仍是1990

    return fn.call({birth:2000}, year);

    }

    };

    obj.getAge(2015); // 25