javascript中call、apply 和 bind 的區別詳解

文章目錄

  • 深入淺出:JavaScript 中的 call、apply 和 bind
    • 一、三位魔法師的共同使命
    • 二、各顯神通的魔法師們
      • 1. call - 即時通訊專家
      • 2. apply - 批量處理高手
      • 3. bind - 預約服務大師
    • 三、魔法師們的對比表格
    • 四、魔法師們的實際應用
      • 1. 借用方法
      • 2. 函數柯里化
      • 3. 事件處理
    • 五、注意事項
    • 六、現代JavaScript的替代方案
    • 結語

在這里插入圖片描述

深入淺出:JavaScript 中的 call、apply 和 bind

在 JavaScript 的世界里,callapplybind 就像是三位各有所長的魔法師,他們都掌握著控制函數執行上下文(this)的魔法,但各有各的施法方式。本文將用生動形象的比喻和通俗易懂的語言,帶你徹底理解這三個方法的聯系與區別。

一、三位魔法師的共同使命

首先,我們需要明白這三位魔法師的共同目標:改變函數執行時的this指向。在 JavaScript 中,this的指向往往讓人困惑,而這三位魔法師就是來解決這個問題的。

const wizard = {name: 'Merlin',castSpell: function() {console.log(`${this.name} casts a spell!`);}
};const muggle = { name: 'Harry' };// 三位魔法師都能讓muggle施法
wizard.castSpell.call(muggle);    // Harry casts a spell!
wizard.castSpell.apply(muggle);   // Harry casts a spell!
const boundSpell = wizard.castSpell.bind(muggle);
boundSpell();                     // Harry casts a spell!

二、各顯神通的魔法師們

1. call - 即時通訊專家

call就像是即時通訊軟件,特點是立即執行,而且參數要一個一個說清楚

function introduce(greeting, punctuation) {console.log(`${greeting}, I'm ${this.name}${punctuation}`);
}const person = { name: 'Alice' };// 用call:立即執行,參數逐個傳遞
introduce.call(person, 'Hello', '!'); // Hello, I'm Alice!

特點總結:

  • 立即執行函數
  • 參數逐個傳遞
  • 適合參數數量確定且較少的情況

2. apply - 批量處理高手

applycall很像,但它更擅長處理批量數據,參數是通過數組傳遞的。

const numbers = [3, 10, 1, 5];// 用apply可以方便地處理數組參數
Math.max.apply(null, numbers); // 10// 等同于
Math.max(3, 10, 1, 5); // 10

特點總結:

  • 立即執行函數
  • 參數通過數組傳遞
  • 適合參數數量不確定或較多的情況

3. bind - 預約服務大師

bind與前兩位不同,它不立即執行函數,而是返回一個新的函數,你可以稍后調用它。

const flight = {airline: 'Air JS',book: function(flightNum, passenger) {console.log(`${passenger} booked ${this.airline} flight ${flightNum}`);}
};const bookFlight = flight.book.bind(flight, 'JS101');
bookFlight('John'); // John booked Air JS flight JS101
bookFlight('Mary'); // Mary booked Air JS flight JS101

特點總結:

  • 不立即執行,返回新函數
  • 可以預先綁定部分參數
  • 適合需要多次調用的場景

三、魔法師們的對比表格

魔法師執行時機參數傳遞返回值典型應用場景
call立即執行逐個傳遞函數返回值明確知道參數個數時
apply立即執行數組傳遞函數返回值參數個數不確定時
bind延遲執行可部分綁定新函數需要多次調用相同this環境

四、魔法師們的實際應用

1. 借用方法

// 類數組對象借用數組方法
const arrayLike = { 0: 'a', 1: 'b', length: 2 };
Array.prototype.push.call(arrayLike, 'c');
console.log(arrayLike); // {0: 'a', 1: 'b', 2: 'c', length: 3}

2. 函數柯里化

// 使用bind實現函數柯里化
function multiply(a, b) {return a * b;
}const double = multiply.bind(null, 2);
console.log(double(5)); // 10

3. 事件處理

// 在事件處理中保持this指向
const button = document.querySelector('button');
const handler = {message: 'Button clicked!',handleClick: function() {console.log(this.message);}
};// 使用bind確保this正確指向handler
button.addEventListener('click', handler.handleClick.bind(handler));

五、注意事項

  1. 嚴格模式的影響

    'use strict';
    function fn() { console.log(this); }
    fn.call(null); // null (非嚴格模式下是window)
    
  2. 箭頭函數的特殊性

    const fn = () => console.log(this);
    fn.call({name: 'obj'}); // 仍然指向定義時的this
    
  3. 性能考慮

    • bind會創建新函數,有一定內存開銷
    • 在性能敏感的場景,可以考慮用callapply替代

六、現代JavaScript的替代方案

隨著ES6的普及,有些場景可以用新特性替代:

// 用擴展運算符替代apply
const nums = [1, 2, 3];
Math.max(...nums); // 替代 Math.max.apply(null, nums)// 用箭頭函數替代bind
const obj = {name: 'obj',fn: function() {setTimeout(() => {console.log(this.name); // 箭頭函數自動綁定this}, 100);}
};

結語

callapplybind是JavaScript中控制this指向的三大神器。雖然現代JavaScript提供了箭頭函數等新特性,但理解這三個方法仍然是掌握JavaScript核心概念的關鍵。記住:

  • call - “立即執行,參數一個一個說”
  • apply - “立即執行,參數打包成數組”
  • bind - “先預約,稍后執行”

掌握了這三位魔法師的技巧,你就能在JavaScript的世界里更加游刃有余地控制函數的執行上下文了!

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

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

相關文章

【PHP】接入百度AI開放平臺人臉識別API,實現人臉對比

目錄 一、需求 二、準備工作 1、申請服務 2、創建應用,獲取開發密鑰 3、官方開發文檔 4、測試人像圖片 三、PHP接入 1、鑒權,獲取access_token 2、人臉對比 四、完整代碼 一、需求 現在人臉識別、人臉對比技術越來越成熟,使用越來越…

【東楓科技】DreamHAT+

DreamHAT 是一款頂部附加硬件 (HAT) 套件,可為 Raspberry Pi 提供 60GHz 毫米波雷達供您使用。 全尺寸 HAT 包含一個英飛凌 BGT60TR13C 芯片,具有單個發射天線和三個接收器(TX/RX),通過 GPIO 引腳和 SPI 連接到 Raspbe…

Spring Boot + MongoDB:從零開始手動配置 MongoConfig 實戰

前言 你以為只要寫上 spring.data.mongodb.*,就能一勞永逸,MongoDB 立馬聽話?別天真,這只是入門級操作,像是拿個自動擋鑰匙,開個小車溜達溜達,遠遠算不上高手操作。當項目需求變得復雜,連接字符串需要靈活配置,或者多數據源并行作戰時,自動配置的魔法顯得捉襟見肘。…

建筑節能目標下,樓宇自控系統以高效運行助力節能減碳

隨著全球氣候變化問題日益嚴峻,節能減排已成為各國政府和企業的重要任務。在建筑領域,樓宇自控系統(Building Automation System, BAS)作為實現建筑節能目標的關鍵技術,正發揮著越來越重要的作用。根據中國政府發布的《…

LOVON——面向足式Open-Vocabulary的VLN導航:LLM做任務分解、YOLO11做目標檢測,最后L2MM將指令和視覺映射為動作,且解決動態模糊

前言 因為項目需要(比如我們在做的兩個展廳講解訂單),近期我一直在研究VLN相關,有些工作哪怕暫時還沒開源(將來可能會開源),但也依然會解讀,比如好處之一是構建完整的VLN知識體系,本文便是其中一例 我在解讀過程中&am…

在線免費的AI文本轉語音工具TTSMaker介紹

TTSMaker是一個在線的文本轉語音工具, 支持多語言和中文方言,不同的語言和方言單次轉換的字符上限從200-10000 不同,轉換的效果還不錯,聽不出明顯的AI痕跡。 工具的網址是:https://ttsmaker.cn/。 工具的界面如上&…

【AI問答】PromQL中interval和rate_interval的區別以及Grafana面板的配置建議

問題1:interval和rate_interval的區別 在PromQL中確實有 $__rate_interval 這個特殊的變量,它與 $__interval 有不同的用途和計算方式。 $__interval vs $__rate_interval 1. $__interval 含義:Grafana計算出的基本時間間隔計算方式&#xff…

STM32學習記錄--Day5

今天了解了:中斷中斷有多個類別包括:USART中斷,I2C中斷等;并通過NVIC來分配中斷的優先級EXTIEXTI的內部結構:EXTI線🔧 ??一、EXTI系統核心架構??1. ??中斷源輸入(左上區域)??…

CentOS7下同步時間的幾種方式(NTP 、Chrony和systemd-timesyncd)

文章目錄前言一、NTP (Network Time Protocol) & ntpd1.原理2. 安裝與配置(ntp 包)3.NTPd 優缺點對比二、Chrony1.原理2.安裝與配置 (chrony 包)3. 優點4. 缺點三、systemd-timesyncd1.原理2.安裝與配置 (systemd 自帶)3. 優點4. 缺點四、手動同步工具1.ntpdate(已廢棄&…

Web3:在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境

相關文章推薦鏈接Web3專欄https://blog.csdn.net/qq_42392981/category_13016259.html在 VSCode 中基于 Foundry 快速構建 Solidity 智能合約本地開發環境引言1. 開發環境準備(Windows)1.1 安裝 VSCode1.2 安裝推薦插件1.3 安裝 Foundry1.4 驗證 Forge 和…

Implement recovery based on PITR using dump file and binlog

模擬生產場景中需要基于某個事務點的恢復,使用存量備份與存量binlog 生成測試數據 (rootlocalhost) [(none)]> create database NanJing; Query OK, 1 row affected (0.01 sec) (rootlocalhost) [test]> use NanJing; Database changed (rootlocalhost) [NanJ…

HTML-取消div,a等標簽點擊效果

一、背景當標簽被設置onclick事件之后,在有些手機瀏覽器中,點擊這些標簽,會有點擊變色效果。想要取消點擊變色效果。通過為div和標簽元素添加-webkit-tap-highlight-color樣式屬性,可以有效地解決這一問題二、解決方案已a標簽示例…

VR 三維重建:開啟沉浸式體驗新時代

在科技飛速發展的今天,VR(虛擬現實)技術已經逐漸滲透到我們生活的各個領域,為我們帶來了前所未有的沉浸式體驗。而 VR 三維重建作為 VR 技術的重要應用之一,更是讓人們能夠身臨其境地感受各種場景,無論是旅…

iTwinjs 幾何 - Curve

CurvePrimitive 常用的見下 LineSegment3d直線段兩點直線邊、桿件、骨架LineString3d折線多點連續直線輪廓線、路徑Arc3d圓弧 / 橢圓弧圓心 半徑 起止角圓孔、圓角、弧段BezierCurve3d貝塞爾曲線端點 控制點平滑過渡、動畫軌跡BSplineCurve3dB 樣條 / NURBS控制點 節點矢…

iPhone 恢復出廠設置是否會刪除所有內容?

當你的 iPhone 經常崩潰、出現黑屏死機、卡在加載屏幕上等問題時,你可能會考慮進行恢復出廠設置來修復它。或者在其他情況下,如果你要將使用多年的設備交給新主人,出于安全考慮,也需要進行恢復出廠設置。那么,恢復出廠…

機器學習②【字典特征提取、文本特征處理(TF-IDF)、數據標準化與歸一化、特征降維】

文章目錄先言一、特征工程概述二、特征提取1.字典特征提取(特征離散化)2.文本特征提取2.1英文文本提取2.2中文文本提取(jieba分詞器)3.TfidfVectorizer TF-IDF文本特征詞的重要程度特征提取三、數據歸一化與標準化1.MinMaxScaler …

3、CC3200串口DMA

先說下CC3200存在2個16*8的fifos, 分別用于發送和接收 當fifos被disable時,將會作為一個1字節深度的保持寄存器, 所以無論fifos是開是關,發送和接收都繞不開fifos DMA 由于發送和接收都繞不過fifos,所以DMA也繞不開FIFOS. MAP_UARTFIFOLevelS…

從游戲NPC到手術助手:Agent AI重構多模態交互,具身智能打開AGI新大門

注:此文章內容均節選自充電了么創始人,CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》(跟我一起學人工智能)【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

Lesson 29 Taxi!

Lesson 29 Taxi! taxi n.出租車 同義詞:cab n.出租車 相關:taxi meter計價器 taxi stand taxi rank 出租車站 call ataxi 叫車,打車 例句:對不起,請問出租車站在哪里? Excuse me, do you know where the taxi rank is please? land v.著陸,登陸n.陸地…

怎樣將allegro的brd文件轉化為AD的PCB文件

由于工作需要將allegro的PCB轉成ad給同事,在使用AD軟件導入Allegro的brd格式文件時出現各種的異常報錯彈窗問題,現分享兩種將Allegro PCB文件導入到AD中的方法。一、第1種方法使用高版本的AD軟件(AD22,同時操作電腦需安裝了Allegr…