此内部对象方法的值

Value of this inside object method?

本文关键字:方法 内部对象      更新时间:2023-09-26

在使用箭头函数调用函数时,我对this的值感到非常困惑。让我们以我为例:

var obj = {
  property: 5,
  func1: function () {
    console.log(this.property);
  },
  func2: () => {
    console.log(this.property);
  }
}

当我将此代码放在浏览器控制台上时,发生了一件有趣的事情,func1()按预期输出5*,但是当我运行func2时,我得到了undefined.这是怎么回事?为什么func2this 的值引用全局对象(在这种情况下Window(。

我想我期待这种输出,因为它就是这样工作的,这就是艾伦和斯莱维特曼分别在这里和这里解释的原因。但根据杰森的解释

箭头函数没有自己的此值。箭头函数中的 this 值始终继承自封闭范围。

那么,为什么这个内func2的价值不是继承他的封闭范围obj的价值呢?

那么,为什么这个内func2的价值不是继承他的封闭范围obj的价值呢?

这里的obj不是"封闭"范围。您在其中定义obj的范围是"封闭"范围。

请考虑以下示例:

var obj = {
  property: 5,
  func1: function () {
      let func2 = () => {
        console.log(this.property); 
      }
      func2();
  },
}
obj.func1(); // logs 5
obj.func1.call({
   property: 6
}) // logs 6

调用内部func2时,this 关键字引用包装器obj func1函数中thisobjfunc2继承this值。内箭头函数不绑定其自己的this值。

func2 中的this是继承函数本身的作用域的值,仅此而已。要使其工作,您必须制作类似的东西:

var obj = {
    property: 5,
    func1: function () {
        console.log(this.property); // shows 5
    },
    func2: () => {
        console.log(this.property); // shows undefined
        this.property = 6;
        console.log(this.property); // shows 6
    }
}