JavaScriptが変数をホイストするのはなぜですか?
巻き上げを実装することを決定したとき、デザイナーの根拠は何でしたか?これを行う他の一般的な言語はありますか?
ドキュメントや記録への関連リンクを提供してください。
Stoyan Stefanovが「JavaScriptパターン」の本で説明しているように、巻き上げはJavaScriptインタープリターの実装の結果です。
2つのパスで実行されるJSコードの解釈。最初のパスでは、インタプリタは変数と関数の宣言を処理します。
2番目のパスは、実際のコード実行ステップです。インタプリタは、関数式と宣言されていない変数を処理します。
したがって、「巻き上げ」の概念を使用して、このような動作を説明できます。
「varの巻き上げは、機能の巻き上げによる意図しない結果であり、ブロックスコープはありませんでした。そして、1995年のラッシュジョブとしてのJSでした。」
「関数の巻き上げにより、トップダウンのプログラム分解が可能になり、 'rec'を無料で実行できます。宣言する前に呼び出します。varの巻き上げにタグを付けます。」
同じ方法で変数を巻き上げる他の一般的な言語は知りません。 ActionScript(Flash開発で使用されるECMAScriptの別の実装)でさえ、巻き上げを実装していなかったと思います。これは、JavaScriptを学習している他の言語に精通している開発者にとって、混乱とフラストレーションの原因となっています。
これは、JavaScriptインタープリターがコードを2サイクルで解釈するためです。
1番目のサイクルでは、すべての変数と関数の宣言が、それが実行されている関数スコープの最上位に配置されます。これは、実行前であっても、関数のexecution context
のvariableObjects
を作成するのに役立ちます。
第2フェーズでは、値の割り当て、コードステートメント、および関数呼び出しは、予想される方法で行ごとに行われます。
あなたはもう少し詳細な読み物を持っています here。
let
、const
、およびclass
宣言に関する動作、および変数と関数の間の優先順位について、よりわかりやすく説明します。