ホームページ > ウェブフロントエンド > jsチュートリアル > ループ内のクリック ハンドラーが予期しない動作を示すのはなぜですか?

ループ内のクリック ハンドラーが予期しない動作を示すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-27 01:47:11
オリジナル
477 人が閲覧しました

Why Do Click Handlers in Loops Exhibit Unexpected Behavior?

ループ内のクリック ハンドラーの適切なクロージャ管理

問題:

ループ内の複数の要素にクリック ハンドラーを割り当てると、予期せぬ動作につながります。具体的には、特定の要素をクリックすると、その要素に関係のないアクションがトリガーされる場合があります。この問題の根本原因は何ですか?

説明:

この問題は、ループ内でクロージャを使用するときに発生します。クロージャがループ内で作成されると、ループ変数への参照が保持されます。この場合、その変数は i です。ただし、ループが進行するにつれて、i は反復ごとに更新されます。その結果、クリック ハンドラーが実行されると、実際にどの要素がクリックされたかに関係なく、i の最終値 (この場合は 20) が使用されます。

解決策:

この問題に対処するには、コールバック関数を使用して、クリック ハンドラーごとに新しいクロージャを作成できます。これにより、各ハンドラーがループ変数への独自の一意の参照を持つことが保証されます。

function createCallback(i) {
  return function() {
    alert('you clicked ' + i);
  };
}
ログイン後にコピー

ループ内で、このコールバック関数を各クリック ハンドラーに割り当てて、各要素の i の正しい値を維持できます。

for (var i = 0; i < 20; i++) {
  $('#question' + i).click(createCallback(i));
}
ログイン後にコピー

現代のオルタナティブES6:

ES6 では、ブロック スコープの変数を許可する let キーワードが導入されています。これは、ループ内の i 変数がそのループに対してローカルになることを意味し、コールバック関数の必要性がなくなります。

for (let i = 0; i < 20; i++) {
  $('#question' + i).click(function() {
    alert('you clicked ' + i);
  });
}
ログイン後にコピー

このアプローチはより簡潔で読みやすいため、現代のアプリケーションで推奨されるオプションになります。 JavaScript の開発

以上がループ内のクリック ハンドラーが予期しない動作を示すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート