web-dev-qa-db-ja.com

JavaScriptが変数をホイストするのはなぜですか?

JavaScriptが変数をホイストするのはなぜですか?

巻き上げを実装することを決定したとき、デザイナーの根拠は何でしたか?これを行う他の一般的な言語はありますか?

ドキュメントや記録への関連リンクを提供してください。

82
Xlaudius

Stoyan Stefanovが「JavaScriptパターン」の本で説明しているように、巻き上げはJavaScriptインタープリターの実装の結果です。

2つのパスで実行されるJSコードの解釈。最初のパスでは、インタプリタは変数と関数の宣言を処理します。

2番目のパスは、実際のコード実行ステップです。インタプリタは、関数式と宣言されていない変数を処理します。

したがって、「巻き上げ」の概念を使用して、このような動作を説明できます。

53
lxgreen

JSクリエーターのブレンダンアイヒ かつて(Twitterで)

「varの巻き上げは、機能の巻き上げによる意図しない結果であり、ブロックスコープはありませんでした。そして、1995年のラッシュジョブとしてのJSでした。」

彼はまた説明しました…

「関数の巻き上げにより、トップダウンのプログラム分解が可能になり、 'rec'を無料で実行できます。宣言する前に呼び出します。varの巻き上げにタグを付けます。」

Brendan Eich

これを行う他の一般的な言語はありますか?

同じ方法で変数を巻き上げる他の一般的な言語は知りません。 ActionScript(Flash開発で使用されるECMAScriptの別の実装)でさえ、巻き上げを実装していなかったと思います。これは、JavaScriptを学習している他の言語に精通している開発者にとって、混乱とフラストレーションの原因となっています。

5
gfullam

これは、JavaScriptインタープリターがコードを2サイクルで解釈するためです。

  1. コード補完/コンパイル:
  2. コード実行:

1番目のサイクルでは、すべての変数と関数の宣言が、それが実行されている関数スコープの最上位に配置されます。これは、実行前であっても、関数のexecution contextvariableObjectsを作成するのに役立ちます。

第2フェーズでは、値の割り当て、コードステートメント、および関数呼び出しは、予想される方法で行ごとに行われます。

あなたはもう少し詳細な読み物を持っています here。

letconst、およびclass宣言に関する動作、および変数と関数の間の優先順位について、よりわかりやすく説明します。

3
Jaspreet Singh