它們各自的定義:
apply:調(diào)用一個對象的一個方法,用另一個對象替換當(dāng)前對象。例如:B.apply(A, arguments);即A對象應(yīng)用B對象的方法。
call:調(diào)用一個對象的一個方法,用另一個對象替換當(dāng)前對象。例如:B.call(A, args1,args2);即A對象調(diào)用B對象的方法。
它們的共同之處:
都“可以用來代替另一個對象調(diào)用一個方法,將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛蓆hisObj指定的新對象”。
它們的不同之處:
apply:最多只能有兩個參數(shù)——新this對象和一個數(shù)組argArray。如果給該方法傳遞多個參數(shù),則把參數(shù)都寫進(jìn)這個數(shù)組里面,當(dāng)然,即使只有一個參數(shù),也要寫進(jìn)數(shù)組里。如果argArray不是一個有效的數(shù)組或arguments對象,那么將導(dǎo)致一個TypeError。如果沒有提供argArray和thisObj任何一個參數(shù),那么Global對象將被用作thisObj,并且無法被傳遞任何參數(shù)。
call:它可以接受多個參數(shù),第一個參數(shù)與apply一樣,后面則是一串參數(shù)列表。這個方法主要用在js對象各方法相互調(diào)用的時候,使當(dāng)前this實例指針保持一致,或者在特殊情況下需要改變this指針。如果沒有提供thisObj參數(shù),那么 Global 對象被用作thisObj。
實際上,apply和call的功能是一樣的,只是傳入的參數(shù)列表形式不同。
重點
改變執(zhí)行上下文?
重新this指向?