call&apply&bind的區(qū)別

相同點(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);

```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容