call和apply的第一個實參是要呼叫函數的母對象,它是呼叫上下文,在函數體內透過this來獲得對它的引用。
例如,如果要想以物件o的方法來呼叫函數f,可以如下的方式使用call和apply方法:
f.call(o);
f.apply(o);
可以照著如下的程式碼:
o.m = f o.m = f.的臨時方法
o.m(); //呼叫這個臨時方法
delete o.m; //將這個臨時方法刪除
來個示例吧。
function testtestn(){Lturna. this.b;
}
var o = {a:1, b:2};
testFun.call(o); //3 比〕〕〕〕〜);
上述程式碼執行的結果皆為3,可以理解為return o.a o.b。
考慮一個問題,如果call和apply方法的第一個實參為null或undefined為怎樣?來看下面的範例:
function testFun(){
return this.a this.b;
}
testFun.call();
testFun.apply();
上述程式碼執行的結果均為30。這是因為call和apply的第一個實參如果傳入的是null或undefined,則會被全域物件取代。
那call和apply這兩個方法有什麼差別呢?
對於call方法來說,第一個呼叫上下文實參之後的所有實參就是要傳入待呼叫函數的值。例如,以物件o的方法的形式呼叫函數f,並傳入兩個參數,就可以使用以下的程式碼:
而apply方法則將第一個實參之後的所有實參放入一個陣列內,
來個範例
複製程式碼
程式碼如下: function testFun(x, y){
return this.a this.b x y;
} testFun.apply(o, [10, 20]);
上述程式碼的執行結果為33,可以理解為 o.breturn o.breturn o.breturn o. 10 20