方法定義
call, apply都屬于Function.prototype的一個方法,它是JavaScript引擎內在實現的,因為屬于Function.prototype,所以每個Function對象實例,也就是每個方法都有call, apply屬性.既然作為方法的屬性,那它們的使用就當然是針對方法的了.這兩個方法是容易混淆的,因為它們的作用一樣,只是使用方式不同.?
不同點:方法傳遞的參數不同
call, apply方法區別是,從第二個參數起, call方法參數將依次傳遞給借用的方法作參數, 而apply直接將這些參數放到一個數組中再傳遞, 最后借用方法的參數列表是一樣的.
栗子:
functionprint(a, b, c, d){
alert(a + b + c + d);
}
functionexample(a, b , c , d){
//用call方式借用print,參數顯式打散傳遞
print.call(this, a, b, c, d);
//用apply方式借用print, 參數作為一個數組傳遞,
//這里直接用JavaScript方法內本身有的arguments數組
print.apply(this, arguments);
//或者封裝成數組
print.apply(this, [a, b, c, d]);
}
//下面將顯示”背光腳本”
example(”背” , “光” , “腳”, “本”);
call方法:
語法:call([thisObj[,arg1[, arg2[,?? [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
說明:
call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。
如果沒有提供 thisObj 參數,那么 Global 對象被用作 thisObj。
function?add(a,b)
{
alert(a+b);
}
function?sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
apply方法:
語法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
說明:
如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。
如果沒有提供 argArray 和 thisObj 任何一個參數,那么 Global 對象將被用作 thisObj, 并且無法被傳遞任何參數。