1. 程式人生 > >js中call()和apply()的區別

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