我有一些使用 C# 和 Java 的经验,但我正在尝试学习 javascript/node.js。我不太明白这段代码有什么问题。
所以我有我的 main.js
文件,它有这段代码:
const MyClass = require("./MyClass");
let myclass = new MyClass("my string!");
myclass.repeatString();
它正在调用的 MyClass
具有以下代码:
class MyClass {
constructor(myString) {
this.myString = myString;
}
repeatString() {
console.log(myString);
}
}
module.exports = MyClass;
当我尝试运行它时,当它尝试执行 repeatString()
方法时,我得到了 ReferenceError: myString is not defined
。我做错了什么/这样做的正确方法是什么?
最佳答案
不像 Java 这样的语言,我们可以在不使用 this
的情况下引用类中的变量,this
绑定(bind) behaves much differently在 JavaScript 中,作用域也是如此。
在 Java 中,这是合法的:
class Test {
int i;
void method() {
System.out.print(i); // <-- Java compiler knows to look for the `i` on the class instance (technically it first looks for `i` locally in the scope of `method` and the goes to look on the class)
}
}
在 JavaScript 中,我们没有这种行为,没有类变量 ( yet ) 这样的东西。
class Test {
i; // <-- Uncaught SyntaxError: Unexpected token ;
method() {
console.log(i);
}
}
对于您的示例,这意味着在引用类中存在的变量(技术上是在对象实例上)时,您始终需要使用 this
。
因此你必须使用this.myString
:
repeatString() {
console.log(this.myString);
}
您收到 Reference Error
因为引擎试图从 repeatString
的范围开始并向上找到一个名为 myString
的变量没有。唯一具有变量 myString
的范围是构造函数中的范围,并且该范围无法从 repeatString
访问。
JavaScript 中的类与 Java 中的类完全不同 ( here's an overview ),尽管语法看起来非常相似。
关于javascript - Java 类和 JavaScript 类之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44917769/