【发布时间】:2017-01-03 14:13:59
【问题描述】:
我知道 ES6 解决了很多 ES5 中 this 关键字存在的问题,比如箭头函数和类。
我的问题与 this 在 ES6 类的上下文中的用法有关,以及为什么必须显式编写它。我最初是一名 Java 开发人员,我来自一个以下代码行非常自然的世界。
class Person {
private String myName;
public Person() {
myName = "Heisenberg";
}
public void sayMyName() {
System.out.println("My name is " + myName);
}
}
编译器将始终引用字段 myName 的值,除非它在方法范围内定义了名称为 myName 的局部变量。
但是,一旦我们将此代码转换为 ES6:
class Person {
constructor() {
this.myName = "Heisenberg";
}
sayMyName() {
console.log(`My name is ${myName}`);
}
}
这不起作用,它会抛出一个Uncaught ReferenceError: myName is not defined。解决此问题的唯一方法是提供明确的 this 引用:
console.log(`My name is ${this.myName}`)
我理解在构造函数中需要this,因为 ES6 类不允许在构造函数之外定义您的字段,但我不明白为什么 Javascript 引擎不能(或不会,因为标准)在sayMyName的情况下,Java编译器可以做同样的事情
【问题讨论】:
-
所以你基本上是在问为什么两种完全不同的语言表现不同?注意“javascript”中的“java”与Java编程语言无关。
-
@luk2302 - 如果你说语言基本上没有关系,那是真的。但是当你说“'javascript' 中的'java' 与编程语言 Java 无关”时,这是错误的,因为你可以通过快速的谷歌搜索来验证。来自维基百科:“...在收到 Sun 的商标许可后,采用了 JavaScript 这个名称。这在当时是一种营销举措,当时 Java 非常流行"
-
您不仅要比较不同的语言,还要比较不同的概念。 “我明白在构造函数中需要这个” 为什么要对构造函数进行不同的处理?
-
这会使语言不一致且更复杂,因为现在我们需要一些其他结构来引用外部范围(而不是成员)中的变量。但是,关于语言设计决策的问题通常不适合 SO。您可能想改用esdiscuss.org 询问。
-
@FelixKling 我想您的评论比当前的评论更好,如果您发布答案我会很乐意接受它
标签: javascript java ecmascript-6 this