javascript函數(shù)的call、apply和bind的原理及作用詳解
最早javascript實(shí)現(xiàn)繼承是通過 prototype 原型鏈,后來有了 class 類,可以像其他面向?qū)ο笳Z言一樣來實(shí)現(xiàn)類的繼承。
通俗點(diǎn)說就好像我們小時(shí)候,家里要將稻子加工成大米,但是家里又沒有打米機(jī),那就只能背到村里別人開的打米房里,叫別人打開他的打米機(jī),將我們的稻子喂進(jìn)去,然后就能接出來大米了。
call
call 方法使用一個(gè)指定的 this 值和單獨(dú)給出的一個(gè)或多個(gè)參數(shù)來調(diào)用一個(gè)函數(shù):
function.call(thisArg, arg1, arg2, ...)
當(dāng)?shù)谝粋€(gè)參數(shù)為 null 或 undefined 時(shí),可以使用數(shù)組展開語法實(shí)現(xiàn)類似的結(jié)果。請(qǐng)注意,this 可能不是該方法看到的實(shí)際值:如果這個(gè)函數(shù)處于非嚴(yán)格模式下,則指定為 null 或 undefined 時(shí)會(huì)自動(dòng)替換為指向全局對(duì)象,原始值會(huì)被包裝。
apply
apply 方法調(diào)用一個(gè)具有給定 this 值的函數(shù),以及以一個(gè)數(shù)組(或一個(gè)類數(shù)組對(duì)象)的形式提供的參數(shù):
function.apply(thisArg, [arg1, arg2])
call 和 apply 其實(shí)是同一個(gè)東西,區(qū)別只有參數(shù)不同,call 是 apply 的語法糖,call 方法接受的是一個(gè)參數(shù)列表,而 apply 方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組
bind
bind 方法創(chuàng)建一個(gè)新的函數(shù),在 bind 被調(diào)用時(shí),這個(gè)新函數(shù)的 this 被指定為 bind 的第一個(gè)參數(shù),而其余參數(shù)將作為新函數(shù)的參數(shù),供調(diào)用時(shí)使用。
function.bind(thisArg[, arg1[, arg2[, ...]]])
三者第一個(gè)參數(shù)都是 this 要指向的對(duì)象,如果如果沒有這個(gè)參數(shù)或參數(shù)為 undefined 或 null,則默認(rèn)指向全局 window。
實(shí)際應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景一:從數(shù)組中找出最大值、最小值
原生的 Math.max、Math.min 只能傳入用逗號(hào)分隔的參數(shù)列表,但實(shí)際業(yè)務(wù)中我們往往拿到的是數(shù)組,就可以用下面的方法來實(shí)現(xiàn)(也可以用擴(kuò)展運(yùn)算符 ... 實(shí)現(xiàn)):
let arr = [1, 2, 3] Math.min.apply(null, arr) // 這里第一個(gè)null表示不需要綁定this, 但是也不能省略,不能直接將arr給Math, 因?yàn)閙in必須接受兩個(gè)及以上參數(shù)
應(yīng)用場(chǎng)景二:偽數(shù)組轉(zhuǎn)化成真數(shù)組
一般用于dom節(jié)點(diǎn)列表、具有 length 和序號(hào)屬性的偽數(shù)組對(duì)象、函數(shù)參數(shù) arguments
Array.prototype.slice.apply(fakeArray) // slice 省略參數(shù)時(shí)就是截取出所有元素,此處相當(dāng)于 Array.prototype.slice.apply(fakeArray, 0, fakeArray.length)
到此這篇關(guān)于javascript函數(shù)的call、apply和bind的原理及作用詳解的文章就介紹到這了,更多相關(guān)javascript函數(shù)的call、apply和bind內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用
這篇文章主要介紹了TypeScript對(duì)于Duck類型和模塊命名空間應(yīng)用,Duck類型是一種動(dòng)態(tài)類型和多態(tài)形式,在duck類型中,重點(diǎn)是對(duì)象的行為可以做什么,而不是對(duì)象所屬的類型2022-08-08JavaScript塊級(jí)作用域綁定的實(shí)現(xiàn)流程
這篇文章主要給大家介紹了關(guān)于JavaScript塊級(jí)作用域綁定的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-12-12JS FormData對(duì)象使用方法實(shí)例詳解
這篇文章主要介紹了JS FormData對(duì)象使用方法,結(jié)合實(shí)例形式詳細(xì)分析了FormData對(duì)象的基本功能、原理及使用方法,需要的朋友可以參考下2020-02-02ES6新特性六:promise對(duì)象實(shí)例詳解
這篇文章主要介紹了ES6新特性之promise對(duì)象,結(jié)合實(shí)例形式詳細(xì)分析了promise對(duì)象的功能、狀態(tài)、使用方法與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04