相同點(diǎn):都是用來(lái)改變this指向
不同點(diǎn):
call()的第一個(gè)參數(shù)是this要指向的對(duì)象,后面?zhèn)魅氲氖菂?shù)列表,參數(shù)可以是任意類(lèi)型,當(dāng)?shù)谝粋€(gè)參數(shù)為null、undefined的時(shí)候,默認(rèn)指向window;
apply接受兩個(gè)參數(shù),第一個(gè)參數(shù)是要綁定給this的值,第二個(gè)參數(shù)是一個(gè)參數(shù)數(shù)組。當(dāng)?shù)谝粋€(gè)參數(shù)為null、undefined的時(shí)候,默認(rèn)指向window。
注:apply 和 call 的用法幾乎相同, 唯一的差別在于:當(dāng)函數(shù)需要傳遞多個(gè)變量時(shí), apply 可以接受一個(gè)數(shù)組作為參數(shù)輸入, call 則是接受一系列的單獨(dú)變量。
bind和call很相似,第一個(gè)參數(shù)是this的指向,從第二個(gè)參數(shù)開(kāi)始是接收的參數(shù)列表。區(qū)別在于bind方法返回值是函數(shù)以及bind接收的參數(shù)列表的使用。
call,apply方法是在調(diào)用之后立即執(zhí)行函數(shù),而bind方法沒(méi)有立即執(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的第一個(gè)參數(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);
```