【js】js中apply()、bind()、call()用法

這三個方法的作用基本上相同,用法上有一些不同,下面先對比一下它們的用法:

  • apply:調用一個具有給定 this 值的函數,以及以一個數組(或一個類數組對象)的形式提供的參數。
    語法:
apply(thisArg)
apply(thisArg, argsArray) 
  • bind:創建一個新的函數,在 bind() 被調用時,這個新函數的 this 被指定為 bind() 的第一個參數,而其余參數將作為新函數的參數,供調用時使用。
    語法:
function.bind(thisArg[, arg1[, arg2[, ...]]])
  • call:使用一個指定的 this 值和單獨給出的一個或多個參數來調用一個函數。
    語法:
function.call(thisArg, arg1, arg2, ...)

舉個例子說明一下:
三個方法解決同樣的問題:
JavaScript 新手經常犯的一個錯誤是將一個方法從對象中拿出來,然后再調用,期望方法中的 this 是原來的對象(比如在回調中傳入這個方法)。如果不做特殊處理的話,一般會丟失原來的對象。

代碼:
apply:

<script>this.x = 9; // 在瀏覽器中,this 指向全局的 "window" 對象var module = {x: 81,getX: function (y) {return this.x+':'+y;},};var module02 = {x: 91};console.log(module.getX(1));var retrieveX = module.getX;console.log(retrieveX(1));// 返回 9:1 - 因為函數是在全局作用域中調用的// 把 'this' 綁定到 module 對象var boundGetX = retrieveX.apply(module,[1]);console.log(boundGetX); // 81:1// 把 'this' 綁定到 module02對象,module02繼承了getXvar boundGetX2 = retrieveX.apply(module02,[1]);console.log(boundGetX2); // 81:1
</script>

輸出結果:
在這里插入圖片描述

bind:

<script>this.x = 9; // 在瀏覽器中,this 指向全局的 "window" 對象var module = {x: 81,getX: function () {return this.x;},};console.log(module.getX());// 81var retrieveX = module.getX;console.log(retrieveX());// 返回 9 - 因為函數是在全局作用域中調用的// 創建一個新函數,把 'this' 綁定到 module 對象// 新手可能會將全局變量 x 與 module 的屬性 x 混淆var boundGetX = retrieveX.bind(module);console.log(boundGetX()); // 81
</script>

輸出結果:
在這里插入圖片描述

call:

<script>this.x = 9; // 在瀏覽器中,this 指向全局的 "window" 對象var module = {x: 81,getX: function (y) {return this.x+':'+y;},};var module02 = {x: 91};console.log(module.getX(1));var retrieveX = module.getX;console.log(retrieveX(1));// 返回 9:1 - 因為函數是在全局作用域中調用的// 把 'this' 綁定到 module 對象var boundGetX = retrieveX.call(module,1);console.log(boundGetX); // 81:1// 把 'this' 綁定到 module02對象var boundGetX2 = retrieveX.call(module02,1);console.log(boundGetX2); // 81:1
</script>

輸出結果:
在這里插入圖片描述
從上面的例子可以看出,apply與call基本相同,區別是apply的第二個參數是傳數組,而call是傳一個或多個參數。bind的區別是調用時要加(),它返回的是一個函數。三者的作用都是為方法指定this的值。

用例:
1、apply用數組獲取最大最小值

const numbers = [5, 6, 2, 3, 7];const max = Math.max.apply(null, numbers);console.log(max);
// Expected output: 7const min = Math.min.apply(null, numbers);console.log(min);
// Expected output: 2

ES6 的寫法:...擴展運算符

Math.max(...[14, 3, 77])

2、將一個數組放到另外一個數組后面

// ES5 的寫法
var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
Array.prototype.push.apply(arr1, arr2);// ES6 的寫法
let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1.push(...arr2);

3、使用 call 方法調用匿名函數
在下例中的 for 循環體內,創建了一個匿名函數,然后通過調用該函數的 call 方法,將每個數組元素作為指定的 this 值執行了那個匿名函數。這個匿名函數的主要目的是給每個數組元素對象添加一個 print 方法,這個 print 方法可以打印出各元素在數組中的正確索引號。當然,這里不是必須得讓數組元素作為 this 值傳入那個匿名函數(普通參數就可以),目的是為了演示 call 的用法。

var animals = [{ species: "Lion", name: "King" },{ species: "Whale", name: "Fail" },
];for (var i = 0; i < animals.length; i++) {(function (i) {this.print = function () {console.log("#" + i + " " + this.species + ": " + this.name);};this.print();}).call(animals[i], i);
}

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

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

相關文章

Metasploitable2靶機漏洞復現

一、信息收集 nmap掃描靶機信息 二、弱口令 1.系統弱口令 在Kali Linux中使用telnet遠程連接靶機 輸入賬號密碼msfadmin即可登錄 2.MySQL弱口令 使用mysql -h 靶機IP地址即可連接 3.PostgreSQL弱密碼登錄 輸入psql -h 192.168.110.134 -U postgres 密碼為postgres 輸入\…

每天一個電商API分享:淘寶商品銷量接口,獲取淘寶商品銷售數據(淘寶商品精準銷量、總銷量、月銷量)

開發背景 商品銷量是商家決策的重要參考指標之一。通過淘寶商品銷量接口&#xff0c;商家可以獲取到實時的銷量信息&#xff0c;從而更好地進行庫存管理、供應鏈計劃和市場推廣等決策。 淘寶商品銷量接口可以提供豐富的銷售數據&#xff0c;包括銷售數量、銷售額、銷售渠道等…

unity中導入自定義模型

unity中導入自定義模型 準備軟件步驟1從SoildWorks中導出模型為STEP格式2將STEP格式文件導入到3DS Max中&#xff0c;再導出為FBX格式3將FBX格式導入至unity中 準備軟件 需要SoildWorks、3DS Max和Unity 3D軟件步驟 1從SoildWorks中導出模型為STEP格式 2將STEP格式文件導入到…

【數據結構】 List與順序表及接口的實現

文章目錄 什么是List常見接口介紹線性表順序表順序表接口的實現add在末尾新增元素在 pos 位置新增元素判定是否包含某個元素查找某個元素對應的位置獲取 pos 位置的元素給 pos 位置的元素設為 value刪除第一次出現的關鍵字key獲取順序表的長度清空順序表 順序表的優缺點優點&am…

全面掌握 Jaeger 分布式調用鏈路跟蹤理論和實戰,Go 為所有使用 go-resty 庫發起 HTTP 請求集成鏈路跟蹤 jaeger(附源碼)

全面掌握 Jaeger 分布式調用鏈路跟蹤理論和實戰,Go 為所有使用 go-resty 庫發起 HTTP 請求集成鏈路跟蹤 jaeger(附源碼)。 介紹一個開源的分布式跟蹤系統 Jaeger,首先從理論基礎知識開始學習,將學習如何在 HTTP 請求中集成鏈路跟蹤,以及如何在 GORM 框架實現,最后學習 …

Qt應用開發(基礎篇)——滾屏區域基類 QAbstractScrollArea

一、前言 QAbstractScrollArea滾屏區域抽象類繼承于QFrame&#xff0c;QFrame繼承于QWidget&#xff0c;是QListview(列表瀏覽器)、QTableview(表格瀏覽器)、QTextEdit(文本編輯器)、QTextBrowser(文本瀏覽器)等所有需要滾屏區域部件的抽象基類。 框架類QFrame介紹 QAbstractSc…

java -jar 啟動服務后,關閉命令窗口后服務停止

java -jar 啟動服務后&#xff0c;關閉命令窗口后服務停止 問題&#xff1a;當我們用java -jar命令啟動服務后&#xff0c;只有一直保持Xshell的窗口開啟且正常連接服務器時才能訪問服務&#xff0c;當關閉命令窗口時&#xff0c;服務會停止運行 解決&#xff1a;使用nohup命…

java之juc二

JMM 請你談談對Volatile的理解 Volatile是jvm提供的輕量級的同步機制&#xff08;和synchronized差不多&#xff0c;但是沒有synchronized那么強大&#xff09; 保證可見性不保證原子性禁止指令重排 什么是JMM JMM&#xff1a;java內存模型&#xff0c;不存在的東西&#…

常用Linux命令

常用Linux命令 1. 基本命令 uname -m 顯示機器的處理器架構 uname -r 顯示正在使用的內核版本 dmidecode -q 顯示硬件系統部件 (SMBIOS / DMI) hdparm -i /dev/hda 羅列一個磁盤的架構特性 hdparm -tT /dev/sda 在磁盤上執行測試性讀取操作系統信息 arch 顯示機器的處理器架構…

一.RocketMQ概念

RocketMQ概念 1.概念2.應用場景3.MQ的優點和缺點4.常見MQ對比 1.概念 MQ(Message Queue)&#xff0c;是一種提供消息隊列服務的中間件&#xff0c;也稱為消息中間件&#xff0c;是一套提供了消息生產、存儲、消費全過程API的軟件系統。 RocketMQ是阿里巴巴2016年MQ中間件&…

Error: Couldn‘t find preset “es2015“ relative to directory

vue引入element-ui&#xff0c;運行時報了這個錯誤 Module build failed: Error: Couldnt find preset "es2015" relative to directory "D:\\360MoveData\\Users\\Administrator\\Desktop\\新建文件夾\\henge-test"at D:\360MoveData\Users\Administrato…

華為云classroom賦能--Devstar使應用開發無需從零開始

華為云DevStar為開發者提供業界主流框架代碼初始化能力&#xff0c;通過GUI、API、CLI等多種方式&#xff0c;將按模板生成框架代碼的能力推送至用戶桌面。同時基于華為云服務資源、成熟的DevOps開發工具鏈和面向多場景的眾多開發模板&#xff0c;提供一站式創建代碼倉、自動生…

Windows server 2016如何安裝OpenSSH

在 Windows Server 2016 上安裝 OpenSSH 需要通過“添加功能和角色”向導來完成。以下是安裝 OpenSSH 的步驟&#xff1a; 1.打開 Windows Server 2016 控制面板。 2.點擊 "程序"&#xff0c;然后選擇 "程序和功能"。 3.在左側菜單中&#xff0c;點擊 &…

【golang】數組和切片底層原理

數組類型的值&#xff08;以下簡稱數組&#xff09;的長度是固定的&#xff0c;而切片類型的值&#xff08;以下簡稱切片&#xff09;是可變長的。 數組的長度在聲明它的時候就必須給定&#xff0c;并且之后不會再改變。可以說&#xff0c;數組的長度是其類型的一部分。比如&a…

Spring學習筆記之Spring IoC注解式開發

文章目錄 聲明Bean的注解Component注解Controller注解Service注解Repository Spring注解的使用選擇性實例化Bean負責注入的注解ValueAutowired與QuaifierResource 全注解式開發 注解的存在主要是為了簡化XML的配置。Spring6倡導全注解開發 注解怎么定義&#xff0c;注解中的屬性…

深入探索JavaEE單體架構、微服務架構與云原生架構

課程鏈接&#xff1a; 鏈接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd4s99 提取碼: 4s99 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦 --來自百度網盤超級會員v4的分享 課程介紹&#xff1a; &#x1f50d;【00】模塊零&#xff1a;開營直播&a…

ARM-M0內核MCU,內置24bit ADC,采樣率4KSPS,傳感器、電子秤、體脂秤專用,國產IC

ARM-M0內核MCU 內置24bit ADC &#xff0c;采樣率4KSPS flash 64KB&#xff0c;SRAM 32KB 適用于傳感器&#xff0c;電子秤&#xff0c;體脂秤等等

[BitSail] Connector開發詳解系列三:SourceReader

更多技術交流、求職機會&#xff0c;歡迎關注字節跳動數據平臺微信公眾號&#xff0c;回復【1】進入官方交流群 Source Connector 本文將主要介紹負責數據讀取的組件SourceReader&#xff1a; SourceReader 每個SourceReader都在獨立的線程中執行&#xff0c;只要我們保證Sou…

Jmeter進階使用:BeanShell實現接口前置和后置操作

一、背景 我們使用Jmeter做壓力測試或者接口測試時&#xff0c;除了最簡單的直接對接口發起請求&#xff0c;很多時候需要對接口進行一些前置操作&#xff1a;比如提前生成測試數據&#xff0c;以及一些后置操作&#xff1a;比如提取接口響應內容中的某個字段的值。舉個最常用…

c語言——拷貝數組

這段代碼是一個簡單的數組拷貝示例。它的功能是將一個原始數組 original 的內容拷貝到另一個數組 copied 中&#xff0c;并輸出兩個數組的元素。 代碼執行過程如下&#xff1a; 首先&#xff0c;在 main() 函數中定義了一個整型數組 original&#xff0c;并初始化了它的元素。…