JavaScript クロージャでループする場合、一意の変数値へのアクセスを維持するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-20 08:53:30
オリジナル
842 人が閲覧しました

When Looping in JavaScript Closures, How to Maintain Access to Unique Variable Values?

JavaScript クロージャからループ内の外部変数にアクセスする

JavaScript では、クロージャを使用する場合、ループ内の変数はポインタによって参照されます。 。これは、ループが完了すると変数の最後の値が使用されることを意味し、機能に不一致が生じます。

この問題に対処するには、クロージャと呼ばれる手法を使用できます。クロージャは本質的には関数を返す関数です。クロージャを使用して変数のスコープを変えることにより、ループの各反復が変数の独自の個別の値を参照することを保証できます。

次のコードを考えてみましょう。

    for (var i in this.items) {
            var item = this.items[i];
            $("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
            $("#showcasebutton_"+item.id).click( 
                // create an anonymous function that will scope "item"
                (function(item) {
                   // that returns our function 
                   return function() {
                    alert(item.id);
                    self.switchto(item.id);
                   };
                })(item) // immediately call it with "item"
            );
    }
ログイン後にコピー

この中でコードを変更すると、項目の現在の値を引数として受け取る匿名関数がループの各反復内で作成されます。これにより、各クリック ハンドラーが item 変数の独自のインスタンスを持つことが保証されます。

または、jQuery の $.each() ヘルパー関数を使用してコードを簡素化し、クロージャの必要性を排除することもできます。

$.each(this.items,function(i, item) {
  $("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
  $("#showcasebutton_"+item.id).click(function() {
    alert(item.id);
    self.switchto(item.id);
  });
});
ログイン後にコピー

クロージャまたは jQuery の $.each() を使用すると、ループの各反復が変数の独自の一意の値にアクセスできるようになり、ループ外の外部変数にアクセスする問題を解決できます。

以上がJavaScript クロージャでループする場合、一意の変数値へのアクセスを維持するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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