1. ホーム
  2. javascript

[解決済み] 変数宣言と変数の束縛は同じですか?

2022-02-09 01:52:53

質問

MDN ドキュメンテーション の状態になります。

を含む (ブロック) スコープの最上位にバインドを作成します。 一般にホイスティングと呼ばれるものです。変数とは異なり var で宣言された場合、値は未定義から始まりますが、let 変数は、その定義が評価されるまで初期化されません。 初期化される前に変数にアクセスすると ReferenceErrorです。この変数は、quot;temporal dead zone"になっています。 が開始され、初期化が処理されるまでの間です。

は、" let バインディングの吊り上げ letconst ) キーワードだけ let , それとも、(キーワードとは関係ない)ストレージスペースの作成だけなのでしょうか?

これまでは、変数キーワードと変数名を合わせて宣言を構成していると考えていましたが 質問 最近質問したところ、回答者は「実は初期化なんです」と言いました。

どのように解決するのですか?

MDNのパラグラフを書いたとき、2つの異なる用語を使ってしまい、申し訳ありませんでした。あの記事では、quot;変数とquot;バインディングを同じものとして理解する必要があります。しかし、詳細について説明しましょう。

A 変数宣言 は、(抽象的な実体としての)変数を作成します。コンパイラに新しい変数を導入するように指示し、また、名前、保持する型、初期値、スコープなどを指示することができる。(言語によって異なる)。JSでは、さまざまなことを行うさまざまな種類の宣言があります。

  • var は、名前、オプションの初期化子、および var
  • function は(オプションの場合もある)名前を持ち、値は常に与えられていて、関数であることが知られています。
  • const 名前があり、初期化子が必要で、不変であり、レキシカルスコープを持つ。
  • ...

A バインディング は、変数名と変数実体の関連付け、例えば"のようなものです。 x で宣言された変数を指します。 class x "です。このような結合はスコープに依存します。つまり、異なるスコープでは異なる結合が存在するため、識別子 x を参照することがあります。 もの を異なるスコープで表示します。
JavaScriptのスコープルールを考えると、変数の宣言はそれ自身のバインディングもそれぞれのスコープに作成されることになります。

つまり、バインディングは名前を使えるようにするものなんですね。それが、私が言及した「"」です。 その let バインディングはスコープの一番上に作成されます となります。これは変数が存在すること、そのためにメモリが割り当てられていること、初期化されていることとは関係ありません。