ES6箭头功能和方法定义之间的差异

时间:2016-10-19 19:34:38

标签: javascript ecmascript-6 arrow-functions

下一个功能有什么区别

module.exports = utils.Backbone.View.extend({
    handler: () => {
       console.log(this);
    } 
});

module.exports = utils.Backbone.View.extend({
    handler() {
       console.log(this);
    } 
});

为什么在第一种情况下this === window

1 个答案:

答案 0 :(得分:1)

由于箭头函数不会创建自己的上下文,因此this具有封闭上下文的原始值。

在您的情况下,封闭上下文是全局上下文,因此箭头函数中的thiswindow

const obj = {
  handler: () => {
    // `this` points to the context outside of this function, 
    // which is the global context so `this === window`
  }
}

另一方面,常规函数的上下文是动态的,当这样的函数被定义为对象的方法时,this指向方法的拥有对象。

const obj = {
  handler() {
    // `this` points to `obj` as its context, `this === obj`
  }
}

以上语法使用ES6 method shorthand。它在功能上等同于:

const obj = {
  handler: function handler() {
    // `this` points to `obj` as its context, `this === obj`
  }
}