JavaScriptのループ内で宣言された変数の巻き上げ動作はどうなっていますか?
ちょっと、そこ!私はホイスティング ビジネスのサプライヤーです。今日は JavaScript の非常に興味深いトピック、つまりループ内で宣言された変数のホイスティング動作について詳しく説明したいと思います。
まず、ホイスティングとは何かを簡単に説明します。 JavaScript におけるホイスティングは、コードが実行される前に、変数と関数の宣言がそれらを含むスコープの先頭に移動されるメカニズムです。これは、JavaScript エンジンがすべての宣言を取得して「巻き上げる」ようなものです。したがって、コード内で実際に宣言される前に、変数を使用したり、関数を呼び出したりすることができます。
さて、ループ内で宣言された変数になると、状況は少し複雑になります。古い学校から始めましょう私たちのキーワード。
で巻き上げる私たちのループ内
使用するときは私たちのループ内で変数を宣言するには、その変数を囲んでいる関数またはグローバル スコープの先頭にホイストします。の私たちのキーワードにはブロックレベルのスコープがありません。機能レベルまたはグローバル スコープのみを持ちます。
この簡単な例を見てください。
for (var i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
このコードでは、次のことを期待しています。0、1、 そして21秒後に印刷されます。しかし、実際に何が起こるかというと、3と3回印刷されます。なぜ?まあ、吊り上げのせいで。のにいた宣言は、それを囲んでいるスコープの先頭に巻き上げられます。までに、setTimeoutコールバックが実行され、ループがすでに終了しており、私は3。
のコールバックsetTimeout関数は同じ変数に対して閉じます私。ループの実行が完了したため、次の値は私は最終値に達しました。3。
この問題を解決するには私たちの、即時に呼び出される関数式 (IIFE) を使用できます。その方法は次のとおりです。
for (var i = 0; i < 3; i++) { (function (j) { setTimeout(function () { console.log(j); }, 1000); })(i); }
このコードでは、IIFE を使用してループの反復ごとに新しいスコープを作成します。現在の値私引数として渡されますjIIFE への、および各コールバックへのsetTimeout別の変数をクローズするようになりましたj。したがって、期待される出力が得られます。0、1、 そして2。
で巻き上げるさせてそして定数ループ内
ES6導入させてそして定数、ブロックレベルのスコープを持ちます。使用するときはさせてまたは定数ループ内で変数を宣言するには、ループの各反復で変数の個別のインスタンスを取得します。
を使用して前の例を書き直してみましょうさせて:
for (let i = 0; i < 3; i++) { setTimeout(function () { console.log(i); }, 1000); }
このコードは正しく印刷されます0、1、 そして21秒後。のさせてキーワードは新しいバインディングを作成します私ループの各反復で。したがって、setTimeoutの別のインスタンスを閉じます私。
同じことが当てはまります定数。使用する場合定数ループ内では、各反復も独自のインスタンスを取得しますが、値を再割り当てすることはできません。定数変数。
for (let i = 0; i < 3; i++) { const j = i * 2; setTimeout(function() { console.log(j); }, 1000); }
このコードは印刷されます0、2、 そして4予想通り、1秒後。
実用的なアプリケーション
ループ内の変数の巻き上げ動作を理解することは、正しい JavaScript コードを作成するために重要であり、特に次のような非同期操作を扱う場合には重要です。setTimeoutまたは AJAX 呼び出し。
たとえば、現実のシナリオでは、リスト内の各項目のデータを API から取得する Web アプリケーションを構築しているとします。各非同期呼び出しに、処理対象の項目の正しい値が含まれていることを確認する必要があります。
ループを使用して製品 ID のリストを反復処理し、各製品に対して API 呼び出しを行っているとします。変数のホイストを正しく処理しないと、すべての API 呼び出しで同じ製品 ID が使用される可能性があります。
const productIds = [1, 2, 3]; for (let i = 0; i < productIds.length; i++) { const productId = productIds[i]; fetch(`https://api.example.com/products/${productId}`) .then(response => response.json()) .then(data => console.log(data)); }
このコードでは、させて各 API 呼び出しが正しいことを保証します。製品ID。
弊社事業における吊り上げ関連
当社は吊り上げサプライヤーとして、さまざまな種類の機器や機構を取り扱っています。 JavaScript に変数ホイスティングに関するさまざまなルールがあるのと同じように、私たちの、させて、 そして定数、私たちは、吊り上げに関してさまざまなルールとベストプラクティスを持っています。金属製造業界。
重金属構造物の吊り上げに関しては、構造用鋼高層ビル用プレハブ 3D 図面、荷重の分散、吊り上げの角度、構造の安定性に細心の注意を払う必要があります。各ホイスティング操作は、ループ内の個別の反復のようなものです。すべてのパラメータが各操作に対して正しく設定されていることを確認する必要があります。
同様に、プレエンジニアリング高層住宅用鉄骨ビル、吊り上げプロセスは複雑であり、構造の設計と吊り上げ装置の機能についての深い理解が必要です。


結論
結論として、JavaScript のループ内で宣言された変数の巻き上げ動作は、使用されるキーワードによって異なります。私たちの関数レベルまたはグローバル スコープを持っているため、非同期操作を伴うループで使用すると予期しない結果が生じる可能性があります。一方で、させてそして定数ブロックレベルのスコープを持ち、ループの各反復で変数の新しいインスタンスを作成します。
高層鉄骨構造物の建設や、JavaScript と同様に吊り上げが必要なその他の業界に携わっている場合、詳細を正確に把握することが重要です。コード内の正しい変数スコープであっても、機器の適切なホイスティング技術であっても、小さな間違いが大きな問題につながる可能性があります。
当社の吊り上げサービスや製品にご興味がございましたら、お気軽にお問い合わせください。調達ニーズについて話し合うために連絡してください。私たちは、JavaScript でのホイスティング動作を明らかにしようとしたのと同じように、ホイスティングのすべての要件をサポートするためにここにいます。
参考文献
- 『JavaScript: 決定版ガイド』デビッド・フラナガン著
- Mozilla Developer Network (MDN) JavaScript ドキュメント
