ホームページ >ウェブフロントエンド >jsチュートリアル >ES6 アロー関数を使用した jQuery クリック ハンドラーで `$(this)` が失敗するのはなぜですか?

ES6 アロー関数を使用した jQuery クリック ハンドラーで `$(this)` が失敗するのはなぜですか?

DDD
DDDオリジナル
2024-12-15 19:47:14152ブラウズ

Why Does `$(this)` Fail in jQuery Click Handlers with ES6 Arrow Functions?

ES6 アロー関数と jQuery $(this): バインディングの混乱

ES6 アロー関数は字句的な this バインディングを提供し、必要性を排除してコードを簡素化します。明示的なbind()呼び出しの場合。ただし、jQuery のクリック バインディングで使用すると、この動作により問題が発生する可能性があります。

アロー関数での予期しない動作:

次のコードを検討してください:

class Game {
  foo() {
    this._pads.on('click', function() {
      if (this.go) { $(this).addClass('active'); }
    });
  }
}

アロー関数を使用する代わりに:

class Game {
  foo() {
    this._pads.on('click', () => {
      if (this.go) { $(this).addClass('active'); }
    });
  }
}

$(this) 参照は ES5 スタイルのクロージャー (self = this) に変換されます。

ES6 の Arrow 関数バインディングについて:

この動作は ES6 のアロー関数に固有のものであり、Traceur の翻訳の問題ではありません。アロー関数は常に、これを周囲のコンテキストに字句的にバインドします。この場合、 foo() メソッドです。

event.currentTarget を使用した解決策:

問題を解決するには、$(this) の代わりにevent.currentTarget を利用して、アロー関数コールバック内でクリックされた要素にアクセスします:

class Game {
  foo(){
    this._pads.on('click', (event) => {
      if(this.go) {
        $(event.currentTarget).addClass('active');
      }
    });
  }
}

jQuery は特に、event.currentTarget を提供します。コールバック関数が正しい this コンテキストにアクセスできない状況に対応します。

以上がES6 アロー関数を使用した jQuery クリック ハンドラーで `$(this)` が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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