」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 巢狀函數中的Javascript“this”指標:如何解決混亂?

巢狀函數中的Javascript“this”指標:如何解決混亂?

發佈於2024-11-12
瀏覽:986

Javascript \

嵌套函數中的Javascript“this”指針難題

在Web開發場景中,嵌套函數中“this”指針的行為可能會令人費解。考慮以下程式碼:

var std_obj = {
  options: {rows: 0, cols: 0},
  activeEffect: "none",
  displayMe: function() {
    // this refers to std_obj
    if (this.activeEffect == "fade") {}

    var doSomeEffects = function() {
      // this surprisingly refers to window object
      if (this.activeEffect == "fade") {}
    }

    doSomeEffects();
  }
};

std_obj.displayMe();

上面的程式碼中,巢狀函數「doSomeEffects()」內的「this」指標意外指向「window」物件。此行為與巢狀函數繼承外部函數作用域的預期相矛盾,其中「this」指的是「std_obj」。

瞭解 Javascript 函數呼叫與作用域

Javascript 函數中「this」的行為取決於函數的呼叫方式。一般有以下三種方式:

  1. 方法呼叫: someThing.someFunction(arg1, arg2, argN)
  2. Function.call 呼叫: someFunction.call(someThing, arg1, arg2, argN)
  3. Function.apply 呼叫: someFunction.apply(someThing, [arg1, arg2, argN])

在所有這些呼叫中,「this ” 物件將是“someThing”。但是,呼叫沒有前導父對象的函數(例如範例中的 doSomeEffects())通常會導致「this」物件被設定為全域對象,在大多數瀏覽器中是「window」物件。

在範例程式碼中,巢狀函數「doSomeEffects()」在沒有父物件的情況下被調用,因此它繼承了全域作用域,並且它的「this」指標指向「window」 目的。這就是您觀察到意外行為的原因。

為了確保巢狀函數可以存取「std_obj」範圍,您可以使用Function.call() 方法呼叫它,並將「std_obj」物件作為第一個參數:

var doSomeEffects = function() {
  // this now refers to std_obj
  if (this.activeEffect == "fade") {}
}

doSomeEffects.call(std_obj);

理解 Javascript 中「this」指標行為的細微差別對於建立健全且可維護的應用程式至關重要。

版本聲明 本文轉載於:1729291459如有侵犯,請洽[email protected]刪除
最新教學 更多>
  • 棘手的 Golang 面試問題 - Max 部分 goroutine 編號
    棘手的 Golang 面試問題 - Max 部分 goroutine 編號
    在 Go 面試中,有時會讓應徵者措手不及的一個問題是「可以產生的 goroutine 的最大數量」。答案並不像說出一個具體數字那麼簡單。相反,面試官通常使用這個問題來評估您對 Go 並發模型、記憶體管理以及 goroutine 實踐經驗的理解。 以下是有效回答此問題的簡明指南: 理...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 的 foreach 迴圈中存取元素的索引?
    如何在 PHP 的 foreach 迴圈中存取元素的索引?
    確定 foreach 索引foreach 循環提供了一種迭代數組的便捷方法,但顯示每個元素的索引可以是挑戰。與傳統的 for 迴圈不同,似乎無法直接存取索引變數。 使用Fo​​r 迴圈在for 迴圈中,可以明確遞增索引,如下所示:for ($i = 0; $i < 10; $i) { ...
    程式設計 發佈於2024-11-15
  • 如何防止 Goroutine 中 HTTP 請求逾時後繼續?
    如何防止 Goroutine 中 HTTP 請求逾時後繼續?
    Goroutine Timeout提供的函數 Find() 使用 goroutine 發出一系列 HTTP 請求並處理它們的回應。然而,令人擔憂的是,即使這些請求超過了指定的逾時時間,這些請求也會在後台繼續運作。 潛在的 Goroutine 洩漏不太可能存在 Goroutine 洩漏代碼。當Find...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 中從陣列中檢索物件屬性列?
    如何在 PHP 中從陣列中檢索物件屬性列?
    從陣列中擷取物件屬性列在應用程式中,通常需要從物件清單中提取特定屬性。這個任務可以在 PHP 中有效率地完成,特別是在較新的語言版本。 使用 array_column() 提取屬性PHP 7.0 及更高版本引入了 array_column() 函數,專為此目的而設計。要擷取一列屬性值,只要將cats...
    程式設計 發佈於2024-11-15
  • 私有資料成員與公共變數:什麼時候應該使用 Getter 和 Setter?
    私有資料成員與公共變數:什麼時候應該使用 Getter 和 Setter?
    透過存取控制平衡私有資料成員在物件導向程式設計中,使用私有資料成員與公用getter 和setter 與使用私有資料成員與公共getter 和setter 之間的爭論公開所有變數仍然是一個討論的話題。 私有資料成員和存取控制私有資料成員的主要目的是強制封裝和資料抽象,確保資料完整性和存取控制。透過限...
    程式設計 發佈於2024-11-15
  • Gdevelop o 代碼遊戲引擎功能。
    Gdevelop o 代碼遊戲引擎功能。
    如果你的專案規模不是那麼大,現在的遊戲開發變得很容易。 我使用 Unity 遊戲引擎來開發遊戲,但我厭倦了為腳本檔案編寫或生成程式碼。 我了解了 Gdevelop 5 遊戲引擎。它需要零編碼,但需要一點物理和數學知識。 您可以透過拖放遊戲物件來創建遊戲。 最佳功能: 只需設計精靈和行為 平台...
    程式設計 發佈於2024-11-15
  • 使用PHP的Substr函數時如何保持單字邊界?
    使用PHP的Substr函數時如何保持單字邊界?
    在PHP 的Substr 中維護單字邊界在Web 開發中,通常需要截斷字串以適應特定的約束,例如資料庫欄位或使用者介面中的字元限制。 PHP substr 函數提供了一種提取子字串的便捷方法,但預設情況下,它不考慮單字邊界。這可能會導致尷尬的截斷,在中間分割單字。 要確保截斷的字串在單字邊界上結束,...
    程式設計 發佈於2024-11-15
  • \“主要是模組和導入導出-package.json!\”
    \“主要是模組和導入導出-package.json!\”
    这里有一个有趣且引人入胜的方式来解释为什么所有四个字段 - module、main、exports 和 import——package.json 中需要: 为什么所有四个字段都很重要: 主要:经典看门人 角色:将 main 视为包中明智的老圣人。它自 Node.js 诞生以来就一直存...
    程式設計 發佈於2024-11-15
  • -?什麼是紗線?
    -?什麼是紗線?
    當您正在處理一個專案時,請看到一個yarn.lock 檔案盯著您,您可能會想,「什麼是yarn?」。那麼就讓我們開始吧。 Yarn 是主要的 JS 套件管理器之一,用於管理 JS 專案中的依賴項(套件和庫)。 套件管理器是幫助開發人員處理專案所需的外部程式庫和模組的工具 → 自動化安裝、更新和...
    程式設計 發佈於2024-11-15
  • 如何辨識 Golang 字串中的特殊字元?
    如何辨識 Golang 字串中的特殊字元?
    在Golang中識別字串中的特殊字元在GoLang中,檢查字串中的特殊字元需要特定的方法。當遇到從使用者輸入獲得的字串時,確保其有效性通常需要驗證是否存在惡意或不需要的字元。本文探討了兩種偵測字串中特殊字元的方法。 方法 1:使用 strings.ContainsAny()strings.Conta...
    程式設計 發佈於2024-11-15
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-15
  • 如何判斷雙精確度浮點數是否為整數?
    如何判斷雙精確度浮點數是否為整數?
    驗證 Double 的整數狀態確定雙精確度浮點數是否為整數值在各種程式設計中非常有用場景。在提供的程式碼片段中:double variable; variable = 5; /* the below should return true, since 5 is an int. if variable...
    程式設計 發佈於2024-11-15
  • 如何使用 Pip 和requirements.txt 從本機目錄安裝軟體套件?
    如何使用 Pip 和requirements.txt 從本機目錄安裝軟體套件?
    使用pip 和requirements.txt從本地目錄安裝軟體包您有一個requirements.txt文件,其中包含要安裝的軟體包列表,包含所需軟體包的本機存檔目錄。 若要使用本機目錄中的pip 安裝軟體包,請依照下列步驟操作步驟:啟動您的虛擬環境:source bin/activate使用有-...
    程式設計 發佈於2024-11-15
  • CSS 中的字體大小實際測量什麼?
    CSS 中的字體大小實際測量什麼?
    確定 CSS 中字母的真實高度 Font-Size在 CSS 中設定字體大小時,了解其真實高度代表什麼非常重要。與您可能想像的相反,字體大小並不直接對應於字母的像素高度。相反,它指的是一個稱為“em”的概念。 「Em」的歷史起源「em」起源於金屬活字印刷時代。它指的是包含每個字母的方塊,通常是基於大...
    程式設計 發佈於2024-11-15
  • 如何在三角形背景下實現線性漸變的平滑線條?
    如何在三角形背景下實現線性漸變的平滑線條?
    線性漸變在背景圖像中創建鋸齒狀邊緣:如何平滑線條努力在圖像上創建尖的底部邊緣,人們可以選擇在底部產生兩個響應三角形。然而,在這樣的設計中實現平滑的線條可能具有挑戰性。正如原始問題中所提到的,用於此目的的線性漸變由於其“硬停止”行為而往往會表現出鋸齒狀邊緣。 解決方案在於修改漸層內的顏色過渡。透過將第...
    程式設計 發佈於2024-11-15

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3