JavaScript で外部変数にアクセスするサブ関数の 3 つのソリューション

JavaScript で外部変数にアクセスするサブ関数の 3 つのソリューション

序文

Web ページを作成するときに、次のような状況に遭遇することはよくあります。

<本文>
  
<div class="btns-wrapper"></div>
  
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<スクリプト>
var ラッパー = $('.btns-wrapper');
(var i = 0; i < 5; i++){
 var btn = $('<button>ボタン' + i + '</button>').appendTo(wrapper);
 btn.on('クリック', 関数(evt){
  console.log('ボタンをクリックしてください: ' + i);
 });
}
</スクリプト>
  
</本文>

コードは非常にシンプルで、ページ上にいくつかのボタンを作成し、ボタンのクリックイベントを定義するだけです。

しかし、ボタンをクリックすると、取得されるシリアル番号は常に i の最後の値である 5 であることがわかります。

これは、クリック イベントを定義するために使用される匿名関数が同じ変数 i を参照するためです。

解決策1: すぐに実行する

var ラッパー = $('.btns-wrapper');
(var i = 0; i < 5; i++){
 var btn = $('<button>ボタン' + i + '</button>').appendTo(wrapper);

 //デフォルトメソッド //btn.on('click', function(evt){
 // console.log('ボタンをクリックします: ' + i);
 // //);

 //方法1: すぐに実行 btn.on('click', (function(n){
  関数を返す(evt){
   console.log('ボタンをクリックしてください: ' + n);
  }
 })(私));

}

このアプローチは、イベントを定義するときに各ボタンに直接個別の匿名関数(クロージャ)を作成し、各関数が正しいi変数を保持するというものである。

解決策2: jQueryイベントパスを使用する

var ラッパー = $('.btns-wrapper');
(var i = 0; i < 5; i++){
 var btn = $('<button>ボタン' + i + '</button>').appendTo(wrapper);

 //デフォルトメソッド //btn.on('click', function(evt){
 // console.log('ボタンをクリックします: ' + i);
 // //);

 //方法 2: JQuery イベントパラメータを使用する btn.on('click', { i: i }, function(evt){
  console.log('ボタンをクリックします: ' + evt.data.i);
 });

}

この方法ははるかに簡単です。jQuery を使用して、パラメータ本体を匿名関数に渡すだけです。

解決策3: DOMのデータ属性を使用する

var ラッパー = $('.btns-wrapper');
(var i = 0; i < 5; i++){
 var btn = $('<button>ボタン' + i + '</button>').appendTo(wrapper);

 //デフォルトメソッド //btn.on('click', function(evt){
 // console.log('ボタンをクリックします: ' + i);
 // //);

 //方法 3: DOM のデータ属性を使用する btn.data('i', i);
 btn.on('クリック', 関数(evt){
  console.log('ボタンをクリックしてください:' + $(this).data('i'));
 });

}

この方法も非常にシンプルですが、データ属性を使用して構造化データを定義できないという欠点があります。

要約する

全体的に、jQuery 環境であれば、イベントパラメータを使用して変数を渡すのが最も簡単で、構造化されたデータを渡すことができます。

それ以外の場合は、即時実行(クローズ)を通じてのみ実行できます。

JavaScript のサブ関数が外部変数にアクセスする方法についてはこれで終わりです。JavaScript のサブ関数が外部変数にアクセスする方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JS関数の継承について学ぶ記事
  • js の関数の長さはどれくらいですか?
  • JavaScript 基礎シリーズ: 関数とメソッド
  • JavaScriptのスリープ関数の使用
  • PHP の組み込み関数 json_encode と json_decode の例外処理
  • JavaScript 関数をよりエレガントにする方法
  • JavaScript の 50 以上のユーティリティ関数の概要
  • JavaScriptコールバック関数の詳細な理解
  • JavaScript 関数型プログラミングの基礎

<<:  Centos 7.4 でリモート アクセス制御を実装する方法

>>:  クエリでのMySQLのユニークキーの使用と関連する問題

推薦する

Nginx10m+の高並列カーネル最適化に関する簡単な説明

高い同時実行性とは何ですか?デフォルトの Linux カーネル パラメータは、最も一般的なシナリオ向...

CSSのline-heightとheightの詳細な説明

最近、CSS インターフェースに取り組んでいるときに、line-height と height とい...

Docker 階層化パッケージを使用して Spring Boot を設定する方法

Spring Boot プロジェクトでは、Docker コンテナ、jar、war の階層化パッケージ...

WeChat アプレットのカスタム タブバー コンポーネント

この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...

Vue のミックスインの使用方法の詳細な説明

目次序文1. Mixin とは何ですか? 2. Mixin はいつ使用すればよいですか? 3. Mi...

React tsx はランダムな検証コードを生成します

React tsxは参照用にランダムな検証コードを生成します。具体的な内容は次のとおりです。最近、t...

JS でパブリッシュ サブスクライブ モデルを作成する

目次1. シーン紹介2 コードの最適化2.1 ファンを増やす問題を解決する2.2 作品追加の問題を解...

mysql.data.dll ドライバーのさまざまなバージョンの簡単な分析

ここにmysqlドライバmysql.data.dllがあります知らせ:ここではX86バージョンが多く...

Tomcat の構成と最適化ソリューションの詳細な説明

サービス.xml Server.xml 構成ファイルは、コンテナー全体を構成するために使用されます。...

Lua モジュールを使用して WAF を実装する Nginx の原理の分析

目次1. WAFの背景2. WAFとは3. 動作原理4. WAF機能5. WAFと従来のファイアウォ...

WeChatアプレットが検索ボックス機能を実装

この記事の例では、WeChatアプレットの検索ボックス機能を実装するための具体的なコードを参考までに...

Docker はすべてのコンテナをバッチ起動して閉じます

Dockerの場合すべてのコンテナコマンドを開始する docker を起動します $(docker ...

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者か...

電子署名を実装するWeChatミニプログラム

この記事では、WeChatミニプログラムで電子署名を実装するための具体的なコードを参考までに紹介しま...

MySQL 8.0 のデフォルトのデータディレクトリを変更する (設定なしの簡単な操作)

使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...