在javascript中,每個(gè)對(duì)象中都會(huì)有一個(gè)apply()方法和一個(gè)call()方法
兩者的相同之處:
兩者作用是都可以替代另一個(gè)對(duì)象調(diào)用一個(gè)方法,將一個(gè)函數(shù)的上下文改變成由thisObj指向的新對(duì)象
當(dāng)我們通過(guò)call和apply來(lái)this的指向時(shí),不傳任何參數(shù),則默認(rèn)為將this指向修改為windows,有參數(shù)時(shí)會(huì)指向第一個(gè)參數(shù)
兩者不同之處:
apply最多只能有兩個(gè)參數(shù)——新this對(duì)象和一個(gè)數(shù)組argArray。如果給該方法傳遞多個(gè)參數(shù),則把參數(shù)都寫(xiě)進(jìn)這個(gè)數(shù)組里面,當(dāng)然,即使只有一個(gè)參數(shù),也要寫(xiě)進(jìn)數(shù)組里。如果argArray不是一個(gè)有效的數(shù)組或arguments對(duì)象,那么將導(dǎo)致一個(gè)TypeError。如果沒(méi)有提供argArray和thisObj任何一個(gè)參數(shù),那么Global對(duì)象將被用作thisObj,并且無(wú)法被傳遞任何參數(shù)。
call它可以接受多個(gè)參數(shù),第一個(gè)參數(shù)與apply一樣,后面則是一串參數(shù)列表。這個(gè)方法主要用在js對(duì)象各方法相互調(diào)用的時(shí)候,使當(dāng)前this實(shí)例指針保持一致,或者在特殊情況下需要改變this指針。如果沒(méi)有提供thisObj參數(shù),那么 Global 對(duì)象被用作thisObj。
案例:
- // apply()方法
- obj.apply(thisObj,['arg1', 'arg2'])
- // call()方法
- obj.call(thisObj,'arg1','arg2','arg3')
以上thisObj繼承了obj的屬性和方法
- // 例1:
- function add(j, k){
- return j+k;
- }
- function sub(j, k){
- return j-k;
- }
- // sub繼承了add方法
- console.log(add(5,3)); //8
- console.log(add.call(sub, 5, 3)); //8
- console.log(add.apply(sub, [5, 3])); //8
- // add繼承了sub方法
- console.log(sub(5, 3)); //2
- console.log(sub.call(add, 5, 3)); //2
- console.log(sub.apply(add, [5, 3])); //2
- // 例2:
- var person = function(){
- this.name = "Tom";
- this.age = 22;
- }
- var other = {};
- console.log(other); // {}
- // other繼承了person的屬性
- person.call(other);
- console.log(other); // {name: "Tom", age: 22}
bind綁定:
call()方法和apply()方法在綁定后會(huì)立即執(zhí)行,而bind則不會(huì)立即執(zhí)行
- add.bind(sub, 5, 3); // 返回的是add方法函數(shù)本體
- add.bind(sub, 5, 3)(); // 8
原文鏈接:https://www.toutiao.com/i6974295878005686788/