SyntaxError: reference to undeclared private field or method #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)

错误类型

SyntaxError

哪里出错了?

与普通字符串或符号属性(如果属性不存在则返回 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);
  }
}

另见