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のユニークキーの使用と関連する問題

推薦する

dockerでビルドしたnacos1.3.0の実装

1. nacosデータベースを再開します。データベース名nacos_configユーザー名とパスワー...

MAC で Mysql5.7.10 のルートパスワードを変更する方法

まず、MySQLをskip-grant-tablesモードで起動します: mysqld --skip...

Vueはカスタム命令を使用してページの下部に透かしを追加します

プロジェクトシナリオプロジェクトの背景全体にカスタム透かしを追加します。透かしのテキスト、フォントの...

HTML で中国語を UTF-8 に変換する方法

HTMLでは、中国語のフレーズ「學好好學」は「學好好學」と表現できます。プロジェクトでは、SMSアラ...

jsはシングルクリックでテーブルを変更することを実装します

Pure jsは、参照用にワンクリックで編集可能なテーブル(トランスクリプトに似たもの)を実装してい...

Linux での NTP サーバー設定の詳細な手順

目次1. 環境設定1.NTPサーバー2. ビジネスサーバー2. NTPサーバーの設定1. chron...

ミニプログラムカスタムコンポーネントの非効率的なグローバルスタイルの解決策

目次長すぎて読めないコンポーネントスタイルの分離デモテスト優先度ページの分離構成参考文献ネイティブ ...

CSS3 を使って本のページめくり効果を実現するサンプルコード

重要なポイント: 1. CSS3 3Dアニメーションをマスターする2. ページめくり後のページ内容の...

JavaScript の継承についてどれくらい知っていますか?

目次序文コンストラクタ、プロトタイプオブジェクト、インスタンスオブジェクトの関係プロトタイプチェーン...

MySQL の binlog_format モードと設定の詳細な分析

MySQL レプリケーションには、SQL ステートメント ベースのレプリケーション (SBR)、行ベ...

MySQL 8.0 における非同期レプリケーションの 3 つの方法について簡単に説明します。

この実験では、空のデータベース、オフライン、オンラインの 3 つのモードで、1 つのマスターと 2 ...

Linux コマンドラインからファイルを削除する実用的な方法

rm コマンドrm コマンドは、ファイルを削除するときによく使用されるコマンドです。ファイルまたはデ...

CentOS7.5 の MySQL8.0.19 のインストールチュートリアルの詳細な手順

1. はじめにこの記事には MySQL インストール部分のスクリーンショットがないので、ある程度の基...

MySQLを5.7にアップグレードすると、WordPressはデータをインポートするときにエラー1067を報告します

最近MySQLを5.7にアップグレードしましたが、WordPressでデータのインポート時にエラーが...

Linux での MongoDB のインストールに関するチュートリアル

MongoDB はクロスプラットフォームであり、Windows と Linux の両方にインストール...