」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 掌握 JavaScript:了解呼叫、應用和綁定。

掌握 JavaScript:了解呼叫、應用和綁定。

發佈於2024-08-19
瀏覽:912

Mastering JavaScript: Understanding call, apply, and bind.

JavaScript 是一種多功能且功能強大的程式語言,構成了現代 Web 開發的支柱。隨著開發人員在 JavaScript 之旅中取得進展,他們會遇到更高級的概念,這些概念可以顯著提高他們的編碼技能。這些概念包括呼叫、應用和綁定方法。這些方法是操作函數執行上下文和管理 this 關鍵字的重要工具。在本文中,我們將深入探討這些方法,了解它們的差異,並學習如何在 JavaScript 專案中有效地使用它們。

理解函數上下文(this)

在深入了解 call、apply 和 bind 之前,了解 JavaScript 中 this 關鍵字的概念至關重要

this 指的是正在執行目前函數的物件。 this 的值取決於函數的呼叫方式:

  • 在物件的方法中,this 指的是該物件。
  • 在函數中,this 指的是全域物件(瀏覽器中的視窗)。
  • 在事件中,這是指接收事件的元素。
  • 在嚴格模式下(“使用嚴格”;),這在函數中未定義。

但是,有時您需要手動設定該值。這就是呼叫、應用和綁定發揮作用的地方。

呼叫方法

call 方法用於呼叫具有特定 this 值和單獨提供的參數的函數。當您想要從另一個物件借用方法或動態設定上下文時,這特別有用。其文法如下:

function.call(thisArg, arg1, arg2, ...)

下面是一個範例來說明 call() 的工作原理:

const person = {
  fullName: function(city, country) {
    console.log(this.firstName   " "   this.lastName   " lives in "   city   ", "   country);
  }
};

const john = {
  firstName: "John",
  lastName: "Doe"
};

person.fullName.call(john, "New York", "USA");
// Output: John Doe lives in New York, USA

在這個範例中,我們使用 call() 呼叫 fullName 函數,並將 john 作為 this 值,有效地借用了 person 物件的方法。

應用方法

apply() 方法與 call() 類似,但它將參數作為陣列。其語法為:

function.apply(thisArg, [argsArray])

舉例。

const person = {
  fullName: function(city, country) {
    console.log(this.firstName   " "   this.lastName   " lives in "   city   ", "   country);
  }
};

const john = {
  firstName: "John",
  lastName: "Doe"
};

person.fullName.apply(john, ["New York", "USA"]);
// Output: John Doe lives in New York, USA

call() 和 apply() 之間的主要區別在於它們處理參數的方式。 call() 期望參數單獨傳遞,而 apply() 期望參數以陣列形式傳遞。

綁定方法

與立即呼叫函數的 call() 和 apply() 不同,bind() 會建立一個具有固定 this 值的新函數。這對於創建稍後可以在特定上下文中調用的函數特別有用。其語法為:

const boundFunction = function.bind(thisArg, arg1, arg2, ...)

以下是 bind() 運作方式的範例:

const person = {
  firstName: "John",
  lastName: "Doe",
  fullName: function() {
    return this.firstName   " "   this.lastName;
  }
};

const logName = function() {
  console.log(this.fullName());
};

const boundLogName = logName.bind(person);
boundLogName(); // Output: John Doe

在此範例中,我們建立一個新函數boundLogName,將 person 永久綁定為其 this 值。

比較和用例

  • call:當您需要呼叫函數並立即控制 this 上下文,單獨傳遞參數時使用。
  • apply:與 call 類似,但當你有參數數組時使用它。
  • bind:當您需要建立稍後可以使用特定 this 上下文呼叫的函數時使用。

性能考慮因素

雖然呼叫、應用和綁定是強大的工具,但考慮它們的效能影響也很重要。 bind() 通常比 call() 或 apply() 慢,因為它創建了一個新函數。如果您正在處理程式碼的效能關鍵部分,您可能需要使用 call() 或 apply() 而不是 bind()。

最佳實踐和常見陷阱

使用呼叫、應用和綁定時,請記住以下最佳實踐:

  • 始終清楚 this 在您的函數中應指涉的內容。
  • 當您想要使用特定的 this 值立即呼叫函數時,請使用 call() 或 apply()。
  • 當你想要建立一個具有固定 this 值的新函數以供以後使用時,請使用 bind()。
  • 將這些方法與箭頭函數一起使用時要小心,因為箭頭函數具有無法更改的詞法 this 綁定。

一個常見的陷阱是忘記bind()傳回一個新函數。確保重新分配綁定函數或直接使用它

結論

掌握呼叫、應用和綁定是成為熟練 JavaScript 開發人員的重要一步。這些方法提供了控制函數執行上下文和管理 this 關鍵字的強大方法。透過理解並有效地使用這些工具,您可以編寫更靈活、可重複使用和可維護的程式碼。

當您繼續探索 JavaScript 時,請記住這些概念只是冰山一角。該語言不斷發展,保持最新功能和最佳實踐的更新至關重要。在您的專案中練習使用 call、apply 和 bind,您很快就會發現自己正在編寫更優雅、更有效率的 JavaScript 程式碼。

版本聲明 本文轉載於:https://dev.to/sagarj521/mastering-javascript-understanding-call-apply-and-bind-4ba5?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    如何修復\“常規錯誤:2006 MySQL Server在插入數據時已經消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    程式設計 發佈於2025-07-16
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-07-16
  • 如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    如何將MySQL數據庫添加到Visual Studio 2012中的數據源對話框中?
    在Visual Studio 2012 儘管已安裝了MySQL Connector v.6.5.4,但無法將MySQL數據庫添加到實體框架的“ DataSource對話框”中。為了解決這一問題,至關重要的是要了解MySQL連接器v.6.5.5及以後的6.6.x版本將提供MySQL的官方Visual...
    程式設計 發佈於2025-07-16
  • Go語言垃圾回收如何處理切片內存?
    Go語言垃圾回收如何處理切片內存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片時,了解垃圾收集行為至關重要,以避免潛在的內存洩...
    程式設計 發佈於2025-07-16
  • Java數組中元素位置查找技巧
    Java數組中元素位置查找技巧
    在Java數組中檢索元素的位置 利用Java的反射API將數組轉換為列表中,允許您使用indexof方法。 (primitives)(鏈接到Mishax的解決方案) 用於排序陣列的數組此方法此方法返回元素的索引,如果發現了元素的索引,或一個負值,指示應放置元素的插入點。
    程式設計 發佈於2025-07-16
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-07-16
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-07-16
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-07-16
  • Java中Lambda表達式為何需要“final”或“有效final”變量?
    Java中Lambda表達式為何需要“final”或“有效final”變量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    程式設計 發佈於2025-07-16
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-07-16
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探討了在運行時發現所有包裝類型(尤其是struntime go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) ...
    程式設計 發佈於2025-07-16
  • 左連接為何在右表WHERE子句過濾時像內連接?
    左連接為何在右表WHERE子句過濾時像內連接?
    左JOIN CONUNDRUM:WITCHING小時在數據庫Wizard的領域中變成內在的加入很有趣,當將c.foobar條件放置在上面的Where子句中時,據說左聯接似乎會轉換為內部連接。僅當滿足A.Foo和C.Foobar標準時,才會返回結果。 為什麼要變形?關鍵在於其中的子句。當左聯接的右側...
    程式設計 發佈於2025-07-16
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-07-16
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-07-16
  • Java字符串非空且非null的有效檢查方法
    Java字符串非空且非null的有效檢查方法
    檢查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。 isement(Isement() trim whitespace whites...
    程式設計 發佈於2025-07-16

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

Copyright© 2022 湘ICP备2022001581号-3