JavaScript 中 call、apply 和 bind 方法的區別與使用

一、核心作用與基礎概念

????????這三個方法都用于顯式改變函數執行時的 this 指向,解決 JavaScript 中函數上下文動態綁定的問題。

1.call()

  • 立即執行函數,第一個參數為 this 指向對象,后續參數為逗號分隔的參數列表

  • 語法:func.call(thisArg, arg1, arg2, ...)

function greet(greeting, punctuation) {console.log(`${greeting}, ${this.name}${punctuation}`);
}
const user = { name: "Alice" };
greet.call(user, "Hello", "!");  // 輸出: "Hello, Alice!"

2.apply()

  • 立即執行函數,第一個參數為 this 指向對象,第二個參數為數組形式的參數列表

  • 語法:func.apply(thisArg, [argsArray])

const numbers = [5, 6, 2, 3, 7];
Math.max.apply(null, numbers); // 輸出: 7

3.bind()

  • 創建一個新函數并永久綁定 this 值,但不立即執行(需手動調用)

  • 語法:const boundFunc = func.bind(thisArg, arg1, arg2, ...)

const module = {x: 42,getX: function() { return this.x }
};
const unboundGetX = module.getX;
const boundGetX = unboundGetX.bind(module); 
boundGetX(); // 輸出: 42

二、關鍵區別對比

特性call()apply()bind()
執行時機立即執行立即執行返回綁定后的函數
參數形式逗號分隔參數數組形式參數逗號分隔參數(可部分綁定)
應用場景明確參數個數時動態參數或數組處理時需要延遲執行或固定上下文
返回值原函數返回值原函數返回值綁定?this?的新函數

三、經典使用場景示例

1.借用對象方法

const car = { brand: "Toyota" };
function showDetails(year) {console.log(`${this.brand} produced in ${year}`);
}
showDetails.call(car, 2022); // Toyota produced in 2022

2.數組合并計算apply 專長)

const arr = [1, 2, 3];
Math.max.apply(null, arr); // 3

3.事件處理綁定bind 專長)

const buttonHandler = {message: "Clicked!",handleClick: function() {console.log(this.message);}
};
document.querySelector("button").addEventListener("click", buttonHandler.handleClick.bind(buttonHandler));

四、核心區別總結

  • call/apply:直接調用函數并動態指定 this,區別僅在于參數傳遞方式

  • bind:創建永久綁定 this 的新函數,適用于回調函數上下文固定5

  • 性能注意:頻繁調用時優先選 call(參數解析快于 apply 的數組解構)

通過顯式綁定 this,這些方法實現了函數與對象的解耦,為 JavaScript 提供了靈活的函數復用能力。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93393.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Android】適配器與外部事件的交互

三三要成為安卓糕手 引入:在上一篇文章中我們完成了新聞展示頁面多布局案例的展示,感悟頗多,本篇文章,繼續去開發一些新的功能 一:關閉廣告 所有的view都可以和我們的用戶做交互,循環視圖中也給我們提供了相…

MySQL的分析查詢語句(EXPLAIN):

目錄 基本語法: 各個字段的含義: id: select_type: table: partitions: type: possible_keys: key: key_len: ref: row: …

C++ #if

在 C 中,#if 是 預處理器指令(Preprocessor Directive),用于 條件編譯,即在編譯階段根據條件決定是否包含某段代碼。它通常與 #define、#ifdef、#ifndef、#else 和 #endif 配合使用。基本語法#if 條件表達式// 如果條件…

方案 | 動車底部零部件檢測實時流水線檢測算法改進

項目背景隨著我國高速鐵路運營里程突破4.5萬公里,動車組日均開行超過8000列次,傳統人工巡檢方式已無法滿足密集運行下的安全檢測需求。車底關鍵部件如制動系統、懸掛裝置、牽引電機等長期承受高強度振動和沖擊,易產生疲勞裂紋、螺栓松動、部件…

企業收款統計:驅動業務決策的核心引擎設計開發——仙盟創夢IDE

代碼完整代碼<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>黑金風格職員統計</title><style>/* 頁面基礎樣式 - 黑金風格 */body {font-family: Segoe UI, Tahoma, Geneva, Verdana, …

CIAIE 2025上海汽車內外飾展觀察:從美學到功能的產業躍遷

在智能化、電動化浪潮推動下&#xff0c;汽車產業的市場格局、技術路線、供應鏈結構與用戶體驗正被系統性重塑。汽車感知空間核心的“內外飾件”&#xff0c;正從原本的結構性、功能性部件&#xff0c;逐步躍升為智能化、情感化和差異化體驗的重要承載載體&#xff0c;開啟了從…

Spring IOC容器在Web環境中的啟動奧秘:深入源碼解析

一、為何需要關注IOC容器啟動&#xff1f;在Java Web開發中&#xff0c;Spring MVC框架的基石正是IOC容器。但你是否思考過&#xff1a;獨立的IOC模塊如何與Tomcat等Servlet容器協同工作&#xff1f; 其啟動過程與Web容器的生命周期深度綁定&#xff0c;這是構建穩定Spring應用…

前端JS處理時間,適用于聊天、操作記錄等(包含剛剛、x分鐘前、x小時前、x天前)

export default {// 首頁時間轉化formatDate(val) {var nowDate new Date()var oldDate new Date(val)const Y oldDate.getFullYear()const M oldDate.getMonth() 1const D oldDate.getDate()var diff nowDate.getTime() - oldDate.getTime()var minutes Math.floor(di…

C#---StopWatch類

老方法&#xff0c;想要全面了解和學習一個類必先看文檔 微軟文檔 1.StopWatch 提供一組方法和屬性&#xff0c;可用來測量運行時間。 1.1 屬性和方法 屬性&#xff1a; 方法&#xff1a; 1.2 使用 using System.Diagnostics;namespace Study04_反射專題 {internal cla…

3DTiles轉OSGB格式逆向轉換方法研究

一、概述 在傾斜攝影的應用領域中&#xff0c;3DTiles與OSGB格式的互轉是常見的技術需求。作為專業的GIS處理平臺&#xff0c;GISBox憑借其先進的傾斜攝影反切功能&#xff0c;為用戶提供了高效、穩定的跨格式數據轉換解決方案。 二、3DTiles轉OSGB的意義 保留原始幾何與紋理…

【門診進銷存出入庫管理系統】佳易王醫療器械零售進銷存軟件:門診進銷存怎么操作?系統實操教程 #醫藥系統進銷存

前言&#xff1a; &#xff08;一&#xff09;試用版獲取方式 資源下載路徑&#xff1a;進入博主頭像主頁第一篇文章末尾&#xff0c;點擊卡片按鈕&#xff1b;或訪問左上角博客主頁&#xff0c;通過右側按鈕獲取詳細資料。 說明&#xff1a;下載文件為壓縮包&#xff0c;使用…

華為交換機配置文件的相關命令和用法

文章目錄一、基本配置命令一、基本配置命令 1、查看當前運行的配置文件 <Huawei>display current-configuration2、配置文件保存 <Huawei>save <Huawei>save vrpcfg-20250623.zip #保存為指定文件名3、查看保存的配置 <Huawei>display saved-configu…

【汽車標定數據】動態優先級線程池在異步多文件解析中的應用

目錄 一、需求背景 項目背景&#xff1a;電控數據管理系統優化 優化方案&#xff1a;引入OLAP數據庫和動態線程池 線程池性能急需解決的問題 資源過載與閑置的平衡&#xff1a; 優先級處理與公平性&#xff1a; 任務類型適配性&#xff1a; 二、線程池介紹 2.1、線程池…

Unity人形角色IK優化指南

目錄 Unity中人形角色的IKI 站立、奔跑IK 1. 接觸面法線 2. 調整質心位置 3. 保持原本朝向 攀爬IK 1. 四肢貼合 2. 保持身體與攀爬面的距離 3. 適應外拐角 瞄準IK 1. 頭部朝向 2. 手臂朝向 尾聲 本文將嘗試僅使用Untiy內置的Animator來解決常見的幾種運動所需的IK…

基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用

1、前言 隨著MCU的發展和需求的增多&#xff0c;USB已成為主流MCU的標配外設&#xff0c;但很多還是全速或低速IP&#xff0c;因此往往用不上高速抓包設備。 2、安裝wireshark和拷貝抓包插件 將抓包插件拷貝到wireshark的extcap目錄里&#xff0c;可參考基于wireshark的USB …

easyexcel模板導出Map數據時空值列被下一行列非空數據覆蓋

場景是&#xff1a;我用模板導出數據&#xff0c;sheet數據是一個List<String,Object>集合&#xff0c;然后發現第一行的第三列應該為空&#xff0c;但是不為空&#xff0c;填上了第二行的第三列數據&#xff1b;就像按列寫數據&#xff0c;碰到空值&#xff0c;下一行數…

并行Builder-輸出型流程編排的新思路

如果對于框架的介紹不感興趣的可以直接跳到Getting Started快速開始 在設計一款數據加載編排框架時&#xff0c;除了任何框架都必須具備的可靠性與穩定性之外&#xff0c;對于本次編排框架的設計&#xff0c;我們把核心目標放在高性能與易用性上。這不僅要求框架能夠快速、高效…

C#WPF實戰出真汁03--登錄界面設計

1、登錄界面設計要點簡潔直觀的布局 登錄界面應避免復雜元素&#xff0c;突出核心功能。通常包含用戶名/郵箱輸入框、密碼輸入框、登錄按鈕及可選功能&#xff08;如“記住我”“忘記密碼”&#xff09;。保持表單字段不超過5個&#xff0c;減少用戶認知負擔。清晰的視覺層次 通…

前端css學習筆記6:盒子模型

本文為個人學習總結&#xff0c;如有謬誤歡迎指正。前端知識眾多&#xff0c;后續將繼續記錄其他知識點&#xff01; 目錄 前言 一、組成 ?編輯content padding border margin margin塌陷 margin合并 使用場景 標題與段落間距 卡片列表布局 二、內容溢出—overflo…

以下是對智能電梯控制系統功能及系統云端平臺設計要點的詳細分析,結合用戶提供的梯控系統網絡架構設計和系統軟硬件組成,分點論述并補充關鍵要點:

智能電梯控制系統功能及系統云端平臺設計要點一、梯控系統網絡架構設計服務本地化&#xff1a;電梯門禁服務器本地化部署&#xff1a;核心服務器部署在項目本地&#xff0c;確保數據安全、運維及時性&#xff0c;減少網絡依賴。需支持本地獨立運行&#xff0c;避免云端故障影響…