首頁  >  文章  >  web前端  >  如何在 JavaScript 回呼中正確存取「this」?

如何在 JavaScript 回呼中正確存取「this」?

Patricia Arquette
Patricia Arquette原創
2024-11-07 19:19:02598瀏覽

How Can I Access

JavaScript 回呼中的這種關聯性

在JavaScript 中,利用事件處理程序回呼中的實例方法可以改變“this”的預期範圍呼叫回調的來源的實例。因此,經常使用類似以下範例的程式碼:

function MyObject() {
  this.doSomething = function() {
    ...
  }

  var self = this
  $('#foobar').bind('click', function(){
    self.doSomethng()
    // this.doSomething() would not work here
  })
}

雖然功能強大,但這種方法可能看起來很奇怪。有沒有更優化的解決方案?

理解閉包和「this」親和性

這個問題超越了 jQuery,源自 JavaScript 對「this」和閉包的處理。閉包允許巢狀函數存取封閉函數中定義的變量,如下所示:

var abc = 1; // we want to use this variable in embedded functions

function xyz(){
  console.log(abc); // it is available here!
  function qwe(){
    console.log(abc); // it is available here too!
  }
  ...
};

「但是,」行為不同。與在特定範圍內保持不變的普通變數不同,「this」可以在不同範圍內動態變化。

// we want to use "this" variable in embedded functions

function xyz(){
  // "this" is different here!
  console.log(this); // not what we wanted!
  function qwe(){
    // "this" is different here too!
    console.log(this); // not what we wanted!
  }
  ...
};

解決方案:給「this」起別名

來規避這個問題挑戰,JavaScript 允許我們將「this」分配給一個變量,本質上是給它起別名。這使我們能夠在整個巢狀函數中引用預期物件。

var abc = this; // we want to use this variable in embedded functions

function xyz(){
  // "this" is different here! --- but we don't care!
  console.log(abc); // now it is the right object!
  function qwe(){
    // "this" is different here too! --- but we don't care!
    console.log(abc); // it is the right object here too!
  }
  ...
};

同樣的原則也適用於其他偽變量,例如「參數」。

以上是如何在 JavaScript 回呼中正確存取「this」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn