javascript中call和apply方法

  咱們能夠將call和apply看作是某個對象的方法,經過調用方法的形式來間接調用函數。call和apply的第一個實參是要調用函數的母對象,它是調用上下文,在函數體內經過this來得到對它的引用。數組

例如,若是要想以對象o的方法來調用函數f,能夠按以下的方式使用call和apply方法:app

  f.call(o);函數

  f.apply(o);this

能夠按以下的代碼來理解:spa

  o.m = f;  //將f存儲爲o的臨時方法對象

  o.m();  //調用這個臨時方法io

  delete o.m;  //將這個臨時方法刪除function

來個示例吧。test

  function testFun(){引用

    return this.a + this.b;

  }

   var o = {a:1, b:2};

  testFun.call(o);  //3

  testFun.apply(o);  //3

  上述代碼執行的結果均爲3,能夠理解爲return o.a + o.b。

 考慮一個問題,若是call和apply方法的第一個實參爲null或者undefined爲怎樣?來看下面的一個例子:

  var a = 10, b = 20;

  function testFun(){

    return this.a + this.b;

  }

  testFun.call();

  testFun.apply();

  上述代碼執行的結果均爲30。這是由於call和apply的第一個實參若是傳入的是null或者undefined,則會被全局對象代替。

 那call和apply這兩個方法有什麼區別呢?

對於call方法來講,第一個調用上下文實參以後的全部實參就是要傳入待調用函數的值。好比,以對象o的方法的形式調用函數f,並傳入兩個參數,就能夠使用以下的代碼:

  f.call(o, 1, 2);

而apply方法則將第一個實參以後的全部實參放入一個數組內,

  f.apply(o, [1, 2]);

來個例子吧

  function testFun(x, y){

    return this.a + this.b + x + y;

  }

  var o = {a:1, b:2};

  testFun.call(o, 10, 20);

  testFun.apply(o, [10, 20]);

 上述代碼的執行結果爲33,能夠理解爲 return o.a + o.b + 10 + 20

相關文章
相關標籤/搜索