ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript イベント ハンドラで「this」が予期しない動作をするのはなぜですか?

JavaScript イベント ハンドラで「this」が予期しない動作をするのはなぜですか?

Susan Sarandon
リリース: 2024-10-28 02:44:02
オリジナル
1036 人が閲覧しました

 Why Does

イベント ハンドラー内のあいまいな「this」

JavaScript を使用する場合、addEventListener メソッドを使用してイベント ハンドラーを作成するのが一般的です。ただし、これらのハンドラー内でオブジェクトのプロパティにアクセスしようとすると、特有の動作が発生します。「this」はオブジェクトを参照するのではなく、イベントをトリガーした要素を参照します。

問題のシナリオ

この問題を示す次のコードを考えてみましょう。

function ticketTable(ticks) {
  this.tickets = ticks;
}

ticketTable.prototype.render = function(element) {
  // Render table...
  cell1.addEventListener("click", this.handleCellClick, false);
};

ticketTable.prototype.handleCellClick = function() {
  // "this" refers to the clicked cell element, not the ticketTable object
  // ...
};
ログイン後にコピー

handleCellClick 関数では、this.tickets へのアクセスは失敗します。これは、「this」が ticketTable インスタンスではなく、クリックされたセルを参照しているためです。

解決策: Bind の使用

この問題を解決するには、bind メソッドを利用します。これにより、指定された関数の "this" の値を明示的に定義できるようになります。 .

function ticketTable(ticks) {
  this.tickets = ticks;
}

ticketTable.prototype.render = function(element) {
  // Render table...
  cell1.addEventListener("click", this.handleCellClick.bind(this), false);
};
ログイン後にコピー

bind(this) を使用すると、後で handleCellClick 関数が呼び出されたときに、「this」が ticketTable オブジェクトを正しく参照し、this.tickets などのそのプロパティにアクセスできるようになります。 .

代替ソリューション

バインド以外の代替アプローチには、(onclick プロパティではなく) "this" を使用するように明示的に定義されたイベント ハンドラー関数を使用するか、特別な handleEvent を作成することが含まれます。すべてのイベントを処理する関数。

以上がJavaScript イベント ハンドラで「this」が予期しない動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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