成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript 中的 Bind()、Apply() 和 Call():鮮為人知的差異

開發 前端
JavaScript 函數是“一等公民”。這意味著它們都是對象值——所有函數都是 Function 類的實例,擁有方法和屬性。

每個開發者都應該充分理解它們的工作原理,并能夠辨別它們之間的微妙差異。

首先要知道,JavaScript 函數是“一等公民”。這意味著它們都是對象值——所有函數都是 Function 類的實例,擁有方法和屬性:

因此,bind()、apply() 和 call() 是每個 JavaScript 函數都具備的三個基本方法。

bind()

你還記得 React 的早期痛苦時代嗎?當時我們仍在使用類組件,并且事件處理程序通常是這樣寫的:

這只是 bind() 的眾多應用之一——一個嚴重被低估的 JavaScript 方法。

沒有 bind(),sayName() 會一團糟——alert() 根本不會生效。

這是因為 React 在內部對這個方法做了一些處理,導致 this 的引用在方法內部完全被搞亂了。

最初,sayName 顯示 alert 是沒有問題的——就像在這個類中的另一個方法一樣:

但是,React 在后臺對 greet 事件處理程序做了什么呢?它將其重新分配給另一個變量:

所以 this 發生了什么?它無法再被找到:

這時候 bind 派上了用場——它將 this 綁定到你選擇的任意實例對象上:

const boundGreet = this.greet.bind(this);

所以我們將函數綁定到了對象——也就是 bind 的目標對象。

(我知道正確的說法是“bound”,但讓我們像說“indexes”代替“indices”一樣說“binded”吧)。

bind 是不可變的——它返回綁定后的函數,而不會改變原始函數。

這讓我們可以多次使用它:

對比 call()

call 和 bind 之間只有一個很小的區別。

bind 創建一個綁定后的函數,可以多次使用。

而 call 呢?它會立即創建一個臨時的綁定函數并調用它:

所以 call() 基本上就是 bind() + 一次調用。

但是當函數有參數時怎么辦?該如何處理呢?

完全沒問題——只需將它們作為更多參數傳遞給 call:

實際上,你也可以用 bind() 做同樣的事情:

對比 apply()

一開始你可能會認為 apply() 與 call() 完全一樣:

但是就像 bind() 和 call() 之間有微妙的區別一樣,apply() 和 call() 之間也有一個細微的區別:參數的傳遞方式。

一個記憶技巧可以幫助你記住它們的區別:

  • call() 適用于用逗號分隔的參數
  • apply() 適用于數組

總結

  • bind()——綁定 this 并返回一個新的函數,可以重復使用。
  • call()——綁定并調用函數,使用逗號分隔的參數傳遞。
  • apply()——綁定并調用函數,使用數組傳遞參數。

這些函數方法是理解 JavaScript 函數和 this 關鍵字的基礎,也是編寫健壯代碼的重要工具。

責任編輯:姜華 來源: 大遷世界
相關推薦

2024-08-20 16:04:27

JavaScript開發

2019-12-12 20:49:05

JavaScript語言運算符

2024-08-26 14:35:19

JavaScript關鍵字對象

2021-06-18 07:16:17

JavaScript apply()方法call()方法

2021-12-05 08:27:56

Javascript 高階函數前端

2024-03-04 16:32:02

JavaScript運算符

2010-01-07 10:05:51

IT顧問特質

2020-03-27 22:33:30

JavaScript運算符逗號

2024-09-10 08:35:57

2024-03-21 14:27:13

JavaScript數組

2024-03-15 08:21:17

bindJavaScrip函數

2014-04-22 16:38:12

GitHubGitHub 使用技巧

2009-02-09 09:16:28

熱鍵自注銷漏洞

2011-03-22 09:49:15

JavaScript

2011-05-03 13:13:52

編程PHPJava

2015-03-02 09:22:09

Javascript函數用法apply

2017-10-10 14:36:07

前端Javascriptapply、call、

2024-05-07 00:00:00

工具類開發者功能

2017-11-08 14:55:16

Linux命令sudo

2015-06-09 11:12:31

Swift語言Swift特性
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一级在线 | 久久视频精品 | 中文字幕在线一区二区三区 | 久青草影院 | 亚洲一区 中文字幕 | 日日夜夜精品 | 97高清国语自产拍 | 看片91| 亚洲成av人片在线观看无码 | 天天天操天天天干 | 一级a性色生活片久久毛片波多野 | 国产香蕉视频 | av在线免费播放 | 午夜一区二区三区在线观看 | 欧美一区二区成人 | 免费一级片 | 国产精品久久久久久久久久久久久久 | 日韩综合在线播放 | 在线观看成人小视频 | 青青草中文字幕 | 亚洲成人在线视频播放 | 国产日韩欧美激情 | 中文字幕亚洲无线 | 日本精品一区二区三区在线观看 | 国产精品揄拍一区二区 | 国产清纯白嫩初高生在线播放视频 | 91精品国产综合久久久久久丝袜 | 久久91精品国产 | 91免费视频观看 | 午夜在线精品偷拍 | 人人爽日日躁夜夜躁尤物 | 国产一级精品毛片 | 久草在线视频中文 | www.嫩草 | 免费不卡av | 男人天堂久久久 | 伊人网站视频 | 日韩一区二区三区在线 | 一级h片| 亚洲综合在线播放 | aaa级片 |