122

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

ホイストを実装することを決定したときの設計者の論理的根拠は何でしたか?これを行う他の人気のある言語はありますか?

ドキュメントおよび/または記録への関連リンクを提供してください。

4

3 に答える 3

59

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

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

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

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

于 2013-02-22T00:22:37.567 に答える
31

JSクリエーターのブレンダンアイクはかつて(ツイッターで)言った

「したがって、varホイストは、機能ホイストの意図しない結果であり、ブロックスコープはなく、1995年の急ぎの仕事としてのJSでした。」

彼はまた次のように説明しました…</h2>

「関数ホイストにより、トップダウンのプログラム分解が可能になります。「let rec」は無料で、宣言する前に呼び出します。varホイストはタグ付けされます。」

ブレンダン・アイク

これを行う他の人気のある言語はありますか?

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

于 2020-01-28T14:54:14.253 に答える
3

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

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

最初のサイクルでは、すべての変数と関数の宣言が、実行中の関数スコープの最上位に移動します。これは、実行前であっても、関数の作成variableObjectsに役立ちます。execution context

第2フェーズでは、値の割り当て、コードステートメント、および関数呼び出しが、期待どおりに1行ずつ実行されます。

ここでもう少し詳しく読んで ください。

それはあなたに周りの振る舞いletconstそしてclass宣​​言、そしてそれが変数と関数の間で従う優先順位についてのより良い絵を与えるでしょう。

于 2019-03-02T13:50:10.703 に答える