javascript 函数范围访问 "this"

javascript function scope accessing "this"

我有以下示例代码。我试图在命名空间函数中获取 this.key 但它总是返回未定义,尽管我更改了函数调用或使用箭头方法等

class Sample {
  key = '';

  constructor(key) {
    this.key = key;
  }

  myNamespace = {
    saySomething: function(message) {
      console.log('message:', message);
      console.log('key:', this.key);
    }
  }

  getTheKey() {
    console.log('key', this.key);
  }
}


let sample = new Sample('thekey');
sample.myNamespace.saySomething('message'); // shows-> key: undefined
sample.getTheKey(); // shows-> key: thekey

“这个”指的是两个不同的东西。您的命名空间函数中的“this”没有键值,但您构造的“sample”有 - 您的 getTheKey 函数准确指向正确的“this”。

更具体地说,getTheKey 指向构造的样本为“this”,而 saySomething 中的函数指向 saySomething 为“this”。构建的样本有 key 的值,而 saySomething 没有。

您可以改用箭头函数,如下所示:

 myNamespace = {
    saySomething: (message) => {
      console.log('message:', message);
      console.log('key:', this.key);
    }

改为以您构建的样本为目标。

你的 myNamespace 属性 的整个观点似乎不仅仅是有问题的,但如果你坚持并且仍然需要一个绑定到你的 class 实例的函数,只需 bind 构造函数中的函数,或使用没有自己的 this 的箭头函数,但保留 this 在定义时指向的任何内容:(代码示例演示了两者):

class Sample {
  key = '';

  constructor(key) {
    this.key = key;
    this.myNamespace.saySomething = this.myNamespace.saySomething.bind(this);
  }

  myNamespace = {
    saySomething: function(message) {
      console.log('message:', message);
      console.log('key:', this.key);
    }
  }
  
  myOtherNamespace = {
    saySomething: (message) => {
      console.log('message:', message);
      console.log('key:', this.key);
    }
  }

  getTheKey() {
    console.log('key', this.key);
  }
}

let sample = new Sample('thekey');

sample.myNamespace.saySomething('message'); // shows-> key: thekey
sample.myOtherNamespace.saySomething('other message'); // shows-> key: thekey
sample.getTheKey(); // shows-> key: thekey