相同點(diǎn):都是用來改變this指向
不同點(diǎn):
call()的第一個參數(shù)是this要指向的對象沸版,后面?zhèn)魅氲氖菂?shù)列表嘁傀,參數(shù)可以是任意類型,當(dāng)?shù)谝粋€參數(shù)為null推穷、undefined的時(shí)候心包,默認(rèn)指向window类咧;
apply接受兩個參數(shù)馒铃,第一個參數(shù)是要綁定給this的值,第二個參數(shù)是一個參數(shù)數(shù)組痕惋。當(dāng)?shù)谝粋€參數(shù)為null区宇、undefined的時(shí)候,默認(rèn)指向window值戳。
注:apply 和 call 的用法幾乎相同, 唯一的差別在于:當(dāng)函數(shù)需要傳遞多個變量時(shí), apply 可以接受一個數(shù)組作為參數(shù)輸入, call 則是接受一系列的單獨(dú)變量议谷。
bind和call很相似,第一個參數(shù)是this的指向堕虹,從第二個參數(shù)開始是接收的參數(shù)列表卧晓。區(qū)別在于bind方法返回值是函數(shù)以及bind接收的參數(shù)列表的使用。
call赴捞,apply方法是在調(diào)用之后立即執(zhí)行函數(shù)逼裆,而bind方法沒有立即執(zhí)行,需要將函數(shù)再執(zhí)行一遍赦政。
? ?```??
let obj1 = {
name:"john1",
sayHello:function(a,b){
console.log(this.name);
console.log(a,b);
}
}
let obj2 = {
name:"john2"
}
//call? 參數(shù)列表
//apply 參數(shù)數(shù)組
obj1.sayHello.call(obj2,10,20);
//默認(rèn)情況下胜宇,sayHello里的this應(yīng)該指向obj1的,但是call改變this指向,讓其指向call的第一個參數(shù)
obj1.sayHello.apply(obj2,[10,20]);
obj1.sayHello.bind(obj2)(10,20);
```
可以用apply取數(shù)組中的最大值和最小值
```
//取數(shù)組中的最大值和最小值
let arr = [10,32,-2,57,13];
let minVal = Math.min.apply(null,arr);
console.log(minVal);
```