JavaScript のループ内で関数を作成するときにクロージャの問題を回避するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-16 17:46:02
オリジナル
108 人が閲覧しました

How to Avoid Closure Issues When Creating Functions Within Loops in JavaScript?

ループ内の JavaScript クロージャ - 実践的な例

JavaScript のループ内で関数を作成する場合、クロージャの可能性を認識することが重要ですこれらの関数で使用される変数が誤って同じ値にバインドされる可能性がある問題。これにより、特に遅延が関係する場合、予期しない動作が発生する可能性があります。

問題ステートメント

次のコードを検討してください:

<code class="js">const funcs = [];
for (var i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value:", i);
  };
}</code>
ログイン後にコピー

意図した出力は:

<code>My value: 0
My value: 1
My value: 2</code>
ログイン後にコピー

ですが、このコードは実際には次のように出力します:

<code>My value: 3
My value: 3
My value: 3</code>
ログイン後にコピー

この問題は、匿名関数内の変数 i がループ外の同じ変数にバインドされているために発生します。 。その結果、各関数が実行されるとき、i の最終値が使用されます。

ES6 解決策: let

ECMAScript 6 (ES6) 、let キーワードを使用すると、ブロック スコープの変数が許可されます。ループ内で let を使用すると、反復ごとに新しい変数が作成され、クロージャの問題が解決されます。

<code class="js">for (let i = 0; i < 3; i++) {
  funcs[i] = function() {
    console.log("My value: " + i);
  };
}</code>
ログイン後にコピー

ES5.1 解決策: forEach

状況主に配列を反復処理している場合、Array.prototype.forEach 関数はクリーンなソリューションを提供できます。

<code class="js">someArray.forEach(function(arrayElement) {
  // ... code for this one element
});</code>
ログイン後にコピー

コールバック関数の各呼び出しは独自のクロージャとなり、渡されるパラメータが特定のものであることが保証されます。

古典的な解決策: クロージャ

クロージャの問題を回避するもう 1 つの方法は、古典的なクロージャを使用することです。これには、各関数内の変数を別の関数にバインドすることが含まれます。不変の値。

<code class="js">function createfunc(i) {
  return function() {
    console.log("My value: " + i);
  };
}</code>
ログイン後にコピー

以上がJavaScript のループ内で関数を作成するときにクロージャの問題を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!