JavaScript中有一個call和apply方法数冬,其作用基本相同,但也有略微的區(qū)別搀庶。
先來看看JS手冊中對call的解釋:
call 方法
調(diào)用一個對象的一個方法拐纱,以另一個對象替換當前對象。
call([thisObj[,arg1[, arg2[,?? [,.argN]]]]])
參數(shù)
thisObj
可選項地来。將被用作當前對象的對象戳玫。
arg1, arg2,??, argN
可選項。將被傳遞方法參數(shù)序列未斑。
說明
call 方法可以用來代替另一個對象調(diào)用一個方法。call 方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對象币绩。
如果沒有提供 thisObj 參數(shù)蜡秽,那么 Global 對象被用作 thisObj。
說明白一點其實就是更改對象的內(nèi)部指針缆镣,即改變對象的this指向的內(nèi)容芽突。這在面向?qū)ο蟮膉s編程過程中有時是很有用的。
引用網(wǎng)上一個代碼段董瞻,運行后自然就明白其道理寞蚌。
functionObj(){this.value="對象田巴!";}
varvalue="global?變量";
functionFun1(){alert(this.value);}
window.Fun1();//global?變量
Fun1.call(window);//global?變量
Fun1.call(document.getElementById('myText'));//input?text
Fun1.call(newObj());//對象!
call函數(shù)和apply方法的第一個參數(shù)都是要傳入給當前對象的對象挟秤,及函數(shù)內(nèi)部的this壹哺。后面的參數(shù)都是傳遞給當前對象的參數(shù)。
運行如下代碼:
varfunc=newfunction(){this.a="func"}
varmyfunc=function(x){
vara="myfunc";
alert(this.a);
alert(x);
}
myfunc.call(func,"var");
可見分別彈出了func和var艘刚。到這里就對call的每個參數(shù)的意義有所了解了管宵。
對于apply和call兩者在作用上是相同的,但兩者在參數(shù)上有區(qū)別的攀甚。
對于第一個參數(shù)意義都一樣箩朴,但對第二個參數(shù):
apply傳入的是一個參數(shù)數(shù)組,也就是將多個參數(shù)組合成為一個數(shù)組傳入秋度,而call則作為call的參數(shù)傳入(從第二個參數(shù)開始)炸庞。
如 func.call(func1,var1,var2,var3)對應(yīng)的apply寫法為:func.apply(func1,[var1,var2,var3])
同時使用apply的好處是可以直接將當前函數(shù)的arguments對象作為apply的第二個參數(shù)傳入。