javaScript 為我們專門提供了壹些函數方法來幫我們更優雅的處理函數內部 this 的指向問題,常用的有 bind()、call()、apply() 三種方法
call() 方法調用壹個對象。簡單理解為調用函數的方式,但是它可以改變函數的 this 指向。
fun.call(thisArg, arg1, arg2, ...)
thisArg:在 fun 函數運行時指定的 this 值
arg1,arg2:傳遞的其他參數
返回值就是函數的返回值,因為它就是調用函數
因此當我們想改變 this 指向,同時想調用這個函數的時候,可以使用 call,比如繼承
fun.apply(thisArg, [argsArray])
thisArg:在fun函數運行時指定的 this 值
argsArray:傳遞的值,必須包含在數組裏面
apply 主要跟數組有關系,比如使用 Math.max() 求數組的最大值
bind() 方法不會調用函數。但是能改變函數內部this 指向
fun.bind(thisArg, arg1, arg2, ...)
thisArg:在 fun 函數運行時指定的 this 值
arg1,arg2:傳遞的其他參數
返回由指定的 this 值和初始化參數改造的原函數拷貝
因此當我們只是想改變 this 指向,並且不想調用這個函數的時候,可以使用 bind
相同點:
都可以改變函數內部的this指向.
區別點:
1.call 和 apply 會調用函數, 並且改變函數內部this指向.
2.call 和 apply 傳遞的參數不壹樣, call 傳遞參數 aru1, aru2..形式 apply 必須數組形式[arg]
3.bind 不會調用函數, 可以改變函數內部this指向.
主要應用場景:
1.call 經常做繼承.
2.apply 經常跟數組有關系. 比如借助於數學對象實現數組最大值最小值
3.bind 不調用函數,但是還想改變this指向. 比如改變定時器內部的this指向。