共同之處:都 可以用來代替另一個對象調(diào)用一個方法奖地,將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?strong>thisObj指定的新對象矩屁。
不同之處:
apply:最多只能有2個參數(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ù)列表筋现,主要用在js對象各方法互相調(diào)用的時候,使當(dāng)前this實例指針保持一致箱歧,或在特殊情況下需要改變this指針矾飞。如果沒有提供thisObj參數(shù),那么Global對象將被用作thisObj呀邢。
總結(jié):
apply和call功能一樣洒沦,只是傳入的參數(shù)列表形式不同。如 func.apply(func1, [var1, var2, var3]), 對應(yīng)的call寫法:func.call(func1, var1, var2, var3)
三個的使用區(qū)別:
都是用來改變函數(shù)的this對象的指向的价淌;
第一個參數(shù)都是this要指向的對象申眼;
都可以利用后續(xù)參數(shù)傳參;
bind是返回對應(yīng)函數(shù)蝉衣,便于稍后調(diào)用括尸,apply、call是立即調(diào)用买乃;