为什么在调用 Javascript 中的类声明中声明的方法时需要“this”关键字?[复制]

Why is `this` keyword necessary in calling methods declared in Class declarations in Javascript? [duplicate]

提问人:ritwick_ _D 提问时间:11/11/2022 最后编辑:chrslgritwick_ _D 更新时间:11/15/2022 访问量:35

问:

这个问题在这里已经有答案了:
去年关闭。

这篇文章是去年编辑并提交审核的,但未能重新打开该帖子:

原始关闭原因未解决

在 MDN 文档中, 当调用静态或原型方法时没有 的值 ,例如将方法分配给变量然后调用它,则该值在方法内部将未定义。thisthis


class Animal {
  speak() {
    return this;
  }
  static eat() {
    return this;
  }
}

const obj = new Animal();
obj.speak(); // the Animal object
const speak = obj.speak;
speak(); // undefined

Animal.eat() // class Animal
const eat = Animal.eat;
eat(); // undefined

我不明白当我们保存对变量的正常/静态方法引用时,为什么我们会丢失 的引用?this

此外,speak() 就像一个普通的类方法。在上面的文字中,这个方法是一个原型方法吗?

作为解决方案,它写道:

如果我们在非严格模式下使用传统的基于函数的语法重写上述内容,则此方法调用会自动绑定到初始 this 值,默认情况下该值是全局对象。在严格模式下,不会发生自动绑定;的值保持传递。this

以及作为解决方案提供的代码:


function Animal() { }

Animal.prototype.speak = function () {
  return this;
}

Animal.eat = function () {
  return this;
}

const obj = new Animal();
const speak = obj.speak;
speak(); // global object (in non–strict mode)

const eat = Animal.eat;
eat(); // global object (in non-strict mode)

“ 那么这个方法调用会自动绑定到初始的 this 值,默认情况下是全局对象。” - this 方法调用发生在哪一行?

链接 : MDN Docs 链接

JavaScript ecmascript-6 这个 ES6 类

评论

0赞 VLAZ 11/11/2022
"我不明白,当我们保存对变量的正常/静态方法引用时,为什么我们会丢失对此的引用?因为对于所有非箭头函数*,值是在调用时确定的。更改它的调用方式,可以影响 的值。*绑定函数也是一个例外,但最好考虑“箭头”与“非箭头”函数,而不是引入具有罕见例外的子类别。thisthis
0赞 Sebastian Simon 11/11/2022
一个更技术性的原因是,这是一个调用表达式,它在内部与 ReferenceRecord 一起使用。ReferenceRecord 是一种规范类型,它确实“记住”了调用的“上下文”(即之前)(具体如何发生这种情况是实现细节),但这种类型在语言中不存在;如果将方法分配到其他位置,则必须计算 ReferenceRecord 才能转换为语言类型;生成的语言类型将是一个(函数)对象,并且对象不会“记住”“上下文”。obj.speak()obj.speak()
0赞 Sebastian Simon 11/11/2022
所以这根本不是JS的工作方式。请参阅“this”关键字如何工作,以及何时应使用它?

答: 暂无答案