ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript のループ内で関数を作成するときにクロージャの問題を回避するにはどうすればよいですか?

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-16 17:46:02112ブラウズ

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。