js中call()和apply()的區別
JS中每個函式都包含兩個非繼承而來的方法:apply()和call()。這兩個方法都用於在特定的作用域中呼叫函式,即將一個函式繫結到另一個函式中,比如有兩個函式A和B,要在B函式中呼叫A函式,就需要用到這兩個方法,說白了就是設定函式體內this物件的值。
call()和apply()方法都接收兩個引數,第一個引數都是this,第二個引數略有不同。call()方法的第二個引數是將原繫結函式的引數逐個列舉出來。例:
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.call(this,num1,num2);
}
alert(callSum1(10,20)); //30
apply()方法的第二個引數有兩種,既可以是將原繫結函式的引數以陣列的方式逐個列舉出來,也可以是arguments物件。例:
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,[num1,num2]);
}
function callSum2(num1,num2){
return sum.apply(this,arguments);
}
alert(callSum1(10,20)); //30
alert(callSum2(10,20)); //30
事實上,傳遞引數並非apply()和call()的真正勇武之地;它們的真正強大之處在於能夠擴充函式來賴以執行的作用域。例:
window.color="red";
var o={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor(); //該方法在全域性作用域中呼叫,this物件指向window
sayColor.call(this); //將該方法繫結到全域性作用域中
sayColor.call(window); //將該方法繫結到全域性作用域中
sayColor.call(o); //將該方法繫結到o物件中,this指向o