JavaScriptが変数をホイストするのはなぜですか?
ホイストを実装することを決定したときの設計者の論理的根拠は何でしたか?これを行う他の人気のある言語はありますか?
ドキュメントおよび/または記録への関連リンクを提供してください。
JavaScriptが変数をホイストするのはなぜですか?
ホイストを実装することを決定したときの設計者の論理的根拠は何でしたか?これを行う他の人気のある言語はありますか?
ドキュメントおよび/または記録への関連リンクを提供してください。
Stoyan Stefanovが「JavaScriptPatterns」の本で説明しているように、巻き上げはJavaScriptインタープリターの実装の結果です。
JSコードの解釈は2つのパスで実行されます。最初のパスで、インタープリターは変数と関数の宣言を処理します。
2番目のパスは、実際のコード実行ステップです。インタプリタは、関数式と宣言されていない変数を処理します。
したがって、このような動作を説明するために「巻き上げ」の概念を使用できます。
「したがって、varホイストは、機能ホイストの意図しない結果であり、ブロックスコープはなく、1995年の急ぎの仕事としてのJSでした。」
「関数ホイストにより、トップダウンのプログラム分解が可能になります。「let rec」は無料で、宣言する前に呼び出します。varホイストはタグ付けされます。」
同じように変数を持ち上げる他の人気のある言語を私は知りません。Flash開発で使用されるECMAScriptの別の実装であるActionScriptでさえ、巻き上げを実装していなかったと思います。これは、JavaScriptを学習している他の言語に精通している開発者にとって混乱とフラストレーションの原因となっています。
これは、javascriptインタープリターが2サイクルでコードを解釈するためです。
最初のサイクルでは、すべての変数と関数の宣言が、実行中の関数スコープの最上位に移動します。これは、実行前であっても、関数の作成variableObjects
に役立ちます。execution context
第2フェーズでは、値の割り当て、コードステートメント、および関数呼び出しが、期待どおりに1行ずつ実行されます。
ここでもう少し詳しく読んで ください。
それはあなたに周りの振る舞いlet
、const
そしてclass
宣言、そしてそれが変数と関数の間で従う優先順位についてのより良い絵を与えるでしょう。