標籤:
JavaScript中有一個call和apply方法,其作用基本相同,但也有略微的區別。
先來看看JS手冊中對call的解釋:
call 方法調用一個對象的一個方法,以另一個對象替換當前對象。call([thisObj[,arg1[, arg2[, [,.argN]]]]])參數thisObj可選項。將被用作當前對象的對象。arg1, arg2, , argN可選項。將被傳遞方法參數序列。說明call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的物件內容從初始的上下文改變為由 thisObj 指定的新對象。如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。
說明白一點其實就是更改對象的內部指標,即改變對象的this指向的內容。這在物件導向的js編程過程中有時是很有用的。
引用網上一個程式碼片段,運行後自然就明白其道理。
<input type="text" id="myText" value="input text"><script> function Obj(){this.value="對象!";} var value="global 變數"; function Fun1(){alert(this.value);} window.Fun1(); //global 變數 Fun1.call(window); //global 變數 Fun1.call(document.getElementById(‘myText‘)); //input text Fun1.call(new Obj()); //對象!</script>
call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。
運行如下代碼:
<script> var func=new function(){this.a="func"} var myfunc=function(x){ var a="myfunc"; alert(this.a); alert(x); } myfunc.call(func,"var");</script>
可見分別彈出了func和var。到這裡就對call的每個參數的意義有所瞭解了。
對於apply和call兩者在作用上是相同的,但兩者在參數上有區別的。
對於第一個參數意義都一樣,但對第二個參數:
apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。
如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])
同時使用apply的好處是可以直接將當前函數的arguments對象作為apply的第二個參數傳入。
如下面代碼所示:
function print(a, b, c, d){ alert(a + b + c + d);}function example(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(”背” , “光” , “腳”, “本”);
最後一句由於直接調用example方法, 所以在該方法中的內容物件this就是window對象.
所以,call, apply方法它們除了第一個參數,即執行時內容物件相同外,call方法的其它參數將依次傳遞給借用的方法作參數,而apply就兩個參數,第二個參數為一個數組傳遞.所以可以說成
call, apply方法區別是,從第二個參數起, call方法參數將依次傳遞給借用的方法作參數, 而apply直接將這些參數放到一個數組中再傳遞, 最後借用方法的參數列表是一樣的.
關於JavaScript中apply與call的用法意義及區別(轉)