對於第一個參數意義都一樣,但對第二個參數:
apply傳入的是一個參數數組,也就是將多個參數組合成爲一個數組傳入,而call則作爲call的參數傳入(從第二個參數開始)。
如 func.call(func1,var1,var2,var3)對應的apply寫法爲:func.apply(func1,[var1,var2,var3])
同時使用apply的好處是可以直接將當前函數的arguments對象作爲apply的第二個參數傳入
call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。
運行如下代碼:
var func=new function(){this.a="func"}
var myfunc=function(x){
var a="myfunc";
alert(this.a);
alert(x);
}
myfunc.call(func,"var");
</script>
Javascript的每個Function對象中有一個apply方法:
1
|
function .apply([thisObj[,argArray]]) |
還有一個類似功能的call方法:
1
|
function .call([thisObj[,arg1[,
arg2[, [,.argN]]]]]) |
它們各自的定義:
apply:應用某一對象的一個方法,用另一個對象替換當前對象。
call:調用一個對象的一個方法,以另一個對象替換當前對象。
它們的共同之處:
都“可以用來代替另一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。”
它們的不同之處:
apply:
最多只能有兩個參數——新this對象和一個數組 argArray。如果給該方法傳遞多個參數,則把參數都寫進這個數組裏面,當然,即使只有一個參數,也要寫進數組裏面。如果 argArray 不是一個有效的數組或者不是 arguments 對象,那麼將導致一個 TypeError。如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj,並且無法被傳遞任何參數。
call:
則是直接的參數列表,主要用在js對象各方法互相調用的時候,使當前this實例指針保持一致,或在特殊情況下需要改變this指針。如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。
如果 argArray 不是一個有效的數組或者不是 arguments 對象,那麼將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用作 thisObj, 並且無法被傳遞任何參數。
更簡單地說,apply和call功能一樣,只是傳入的參數列表形式不同:如 func.call(func1,var1,var2,var3) 對應的apply寫法爲:func.apply(func1,[var1,var2,var3])
也就是說:call調用的爲單個,apply調用的參數爲數組