call和apply方法學習筆記
阿新 • • 發佈:2021-12-22
一直沒有搞清楚call()
和apply()
,今天學習了一下
避雷:對於Array.silce.call(arguments)
這種型別的呼叫,這裡不是arguments呼叫了silce,silce的呼叫者並沒有發生改變,只是silce內部的this指向了arguments
-
call()
-
使用一個指定的
this
值和單獨給出的一個或多個引數來呼叫一個函式。 -
使用
call()
只是改變了this
的指向,方法的呼叫者沒有改變// 在這個方法裡,slice內部的this指向了arguments,而slice的呼叫者仍然是Array Array.prototype.slice().call(arguments)
-
call()
方法可以不傳遞引數(非嚴格模式),在非嚴格模式下不傳參的call()
方法會指定this
為全域性物件,同樣的還有this
指定為null
和undefined
。嚴格模式下不傳參和傳遞null
或者undefined
會報錯 -
call()
方法傳遞的第一個引數為指定的this
,剩餘的引數是要給函式傳遞的引數call(this,arg1,arg2,arg3,...)
-
-
apply()
-
方法呼叫一個具有給定
this
值的函式,以及以一個數組(或類陣列物件)的形式提供的引數。 -
apply()
方法必須傳遞引數!!雖然這麼說,但是在非嚴格模式下不傳遞引數或者傳null
undefined
會自動替換指向全域性物件 -
apply()
和call()
基本一致,但時apply()
接受的剩餘引數是一個數組apply(this,[])
-
-
apply()
和call()
的區別:- 按照 MDN 來說,
apply
的引數是必須的,而call()
的引數是可選的,但實際上都可以不寫。。。 apply()
最多隻有兩個引數,接收剩餘引數是一個數組或者偽陣列形式;而call()
的引數沒有限制接收剩餘引數是類似於形參的樣式
- 按照 MDN 來說,
-
apply()
的巧妙用法:某些方法提供了傳遞多個引數,但不支援傳遞陣列時,可以使用apply()
幫我們把陣列中的元素依次傳遞到這些方法裡面,比如獲取一個數組中的最大值:// Math.max() 不支援傳入陣列,只支援Math.max(num1,num2,...)這種型別的傳參 // 可以利用apply()方法獲得一個數組中的最大值 const arr = [1,2,400,4,5] let result = Math.max.apply(null,arr) console.log(result) // 400