簡體   English   中英

JavaScript 中的 class 如何吊裝?

[英]How hoisting works for a class in JavaScript?

JavaScript class 參考中的術語提升是:您首先需要聲明您的 class 然后訪問它,否則類似以下的代碼將引發 ReferenceError:

const p = new Rectangle(); // ReferenceError
class Rectangle {}

在其他參考資料中:所有變量聲明都被提升到其 scope 的頂部,而不管實際聲明是在哪里進行的。

然而 MDN 說:

在 ECMAScript® 2015 語言規范之前,您不會在任何規范規范散文中發現提升這個術語。 提升被認為是思考 JavaScript 中執行上下文(特別是創建和執行階段)如何工作的一般方式。 然而,這個概念一開始可能有點混亂。

它看起來提升意味着很多我所理解的。 但是,在聲明之前使用某些東西很奇怪,但是它對類的工作方式不同,而 class 也是 JavaScript 中的 function 的一種類型。

實際上類被提升,因為變量綁定在整個 scope 中可用,但它們沒有被初始化。

參考: 在 ES6 中是否使用 let 或 const 聲明了變量?

吊裝不適用於課程。 僅適用於變量和函數。
可以在聲明變量之前初始化變量或調用 function。
請參閱以下代碼段。 它不會拋出錯誤,而是將“Foo”記錄到控制台上。

 var p = new rectangle(); function rectangle() { console.log("Foo") }

在 Javascript 中的提升是在執行任何代碼段之前將聲明放入 memory 是它允許您在代碼中聲明之前使用 function。

例如:

foo("bar");

function foo(name) {
  console.log(name);
}

Javascript 吊裝允許您在聲明之前調用 function。 注意:Javascript 沒有類的提升。

Class 是Reference type

const 僅適用於Value type數據

所以你不能使用 Class 作為 const

Rectangle p = new Rectangle(); 
class static Rectangle {}

您想知道的可以在規范中找到,在https://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-statements-and-declarations一章中,詳細說明了不同的聲明的類型。

  • 宣言:
    • 可提升聲明
    • 類聲明
    • 詞法聲明
  • 可提升聲明:
    • 功能聲明
    • 生成器聲明

它明確指出HoistableDeclaration包括函數和生成器,而ClassDeclaration是簡單Declaration的一部分。

這意味着functionfunction*可以在其聲明之前使用,在聲明它們的 scope 內,其他所有情況都不是這樣:

  • letconstvar在分配之前將是undefined
  • class將在其聲明之前未初始化

您觀察到的ReferenceError如下所述: https://www.ecma-international.org/ecma-262/6.0/#sec-declarative-environment-records-getbindingvalue-ns

參考1https://scotch.io/tutorials/understanding-hoisting-in-javascript

JavaScript 類也可以大致分類為:

  • Class 聲明
  • Class 表達式

Class 聲明

就像他們的 function 對應物一樣,JavaScript class 聲明被吊起。 但是,它們在評估之前保持未初始化。 這實際上意味着您必須先聲明一個 class 才能使用它。

var Frodo = new Hobbit();
Frodo.height = 100;
Frodo.weight = 300;
console.log(Frodo); // Output: ReferenceError: can't access lexical declaration `Hobbit' before initialization

class Hobbit {
  constructor(height, weight) {
    this.height = height;
    this.weight = weight;
  }
}

因此,就 class 聲明 go 而言,要訪問 class 聲明,您必須先聲明。

Class 表達式

就像他們的 function 對應物一樣,class 表達式沒有被提升。 這是 class 表達式的未命名或匿名變體的示例。

var Square = new Polygon();
Square.height = 10;
Square.width = 10;
console.log(Square); // Output: TypeError: Polygon is not a constructor

var Polygon = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

關於 JavaScript es6 let、const 變量和類實際上是否被提升、粗略提升或不被提升,有一些爭論。 一些人爭辯說它們實際上已被吊起但未初始化,而有些人則認為它們根本沒有被吊起。 因此,我們應該養成在使用前聲明和初始化 JavaScript 變量的習慣。 在 JavaScript es5 中使用嚴格模式可以幫助暴露未聲明的變量。

PS:其他參考待續...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM