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);
  }
}

另見