call,bind,apply 相同點都是改變this的指向跪解,傳入?yún)?shù)。不同的是 call apply返回函數(shù)結果, bind 返回新函數(shù).
apply 和 call 的區(qū)別是 call 方法接受的是若干個參數(shù)列表恨诱,而 apply 接收的是一個包含多個參數(shù)的數(shù)組搀矫。
bind()和call與apply不同。bind是新創(chuàng)建一個函數(shù)肉渴,然后把它的上下文綁定到bind()括號中的參數(shù)上房蝉,然后將它返回僚匆。
所以,bind后函數(shù)不會執(zhí)行搭幻,而只是返回一個改變了上下文的函數(shù)副本咧擂,而call和apply是直接執(zhí)行函數(shù)。
apply方法
apply接受兩個參數(shù)檀蹋,第一個參數(shù)是this的指向松申,第二個參數(shù)是函數(shù)接受的參數(shù),以數(shù)組的形式傳入续扔,且當?shù)谝粋€參數(shù)為null攻臀、undefined的時候,默認指向window(在瀏覽器中)纱昧,使用apply方法改變this指向后原函數(shù)會立即執(zhí)行刨啸,且此方法只是臨時改變thi指向一次。
日常用法:改變this指向
示例:
回調函數(shù)綁定this指向:
```
var name="martin";
var obj={
name:"lucy",
say:function(year,place){
console.log(this.name+" is "+year+" born from "+place);
}
};
var say=obj.say;
setTimeout(function(){
say.apply(obj,["1996","China"])
} ,0); //lucy is 1996 born from China,this改變指向了obj
say("1996"识脆,"China") //martin is 1996 born from China,this指向window设联,說明apply只是臨時改變一次this指向
```
call方法
call方法的第一個參數(shù)也是this的指向善已,后面?zhèn)魅氲氖且粋€參數(shù)列表(注意和apply傳參的區(qū)別)。當一個參數(shù)為null或undefined的時候离例,表示指向window(在瀏覽器中)换团,和apply一樣,call也只是臨時改變一次this指向宫蛆,并立即執(zhí)行艘包。
示例:
```
var arr=[1,10,5,8,3];
console.log(Math.max.call(null,arr[0],arr[1],arr[2],arr[3],arr[4])); //10
```
采納以參數(shù)列表的形式傳入,而apply以參數(shù)數(shù)組的形式傳入耀盗。
bind方法
bind方法和call很相似想虎,第一參數(shù)也是this的指向,后面?zhèn)魅氲囊彩且粋€參數(shù)列表(但是這個參數(shù)列表可以分多次傳入叛拷,call則必須一次性傳入所有參數(shù))舌厨,但是它改變this指向后不會立即執(zhí)行,而是返回一個永久改變this指向的函數(shù)忿薇。
示例:
```
var arr=[1,10,5,8,12];
var max=Math.max.bind(null,arr[0],arr[1],arr[2],arr[3])
console.log(max(arr[4])); //12裙椭,分兩次傳參
```
可以看出,bind方法可以分多次傳參署浩,最后函數(shù)運行時會把所有參數(shù)連接起來一起放入函數(shù)運行
apply揉燃,call,bind三者的區(qū)別
三者都可以改變函數(shù)的this對象指向瑰抵。
三者第一個參數(shù)都是this要指向的對象你雌,如果如果沒有這個參數(shù)或參數(shù)為undefined或null器联,則默認指向全局window二汛。
三者都可以傳參,但是apply是數(shù)組拨拓,而call是參數(shù)列表肴颊,且apply和call是一次性傳入?yún)?shù),而bind可以分為多次傳入渣磷。
bind 是返回綁定this之后的函數(shù)婿着,便于稍后調用;apply 醋界、call 則是立即執(zhí)行 竟宋。