先來看看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的第二個參數傳入