语法错误: 引用未声明的私有字段或方法 #x

当使用 私有名称 时,JavaScript 异常“对未声明的私有字段或方法 #x 的引用”会发生,但此私有名称未在类范围内声明。

信息

SyntaxError: Private field '#x' must be declared in an enclosing class (V8-based)
SyntaxError: reference to undeclared private field or method #x (Firefox)
SyntaxError: Cannot reference undeclared private names: "#x" (Safari)

错误类型

哪里出错了?

与返回 undefined(如果属性不存在)的普通字符串或符号属性不同,私有名称非常严格,只有在实际存在时才能合法访问。访问未声明的私有名称会导致语法错误,而访问已声明但对象不存在的私有名称会导致 类型错误

示例

未声明的私有字段

无法访问未在类范围内声明的私有字段。

js
class MyClass {
  doSomething() {
    console.log(this.#x);
  }
}

如果您使用 in 运算符对未声明的私有字段执行检查,也会发生相同的错误。

js
class MyClass {
  doSomething() {
    console.log(#x in this);
  }
}

这些代码可能是错误的,因为如果 #x 未在类范围内声明,则不可能在 this 上存在。请注意,您不能动态地添加私有属性到无关的对象。您应该删除此代码或在类范围内声明私有字段。

js
class MyClass {
  #x = 0;
  doSomething() {
    console.log(this.#x);
  }
}

另请参阅