apply、call和bind的區別

  apply的call的區別數組

  其實很簡單,二者的區別就在於調用時的參數不同。看一下代碼:app

 1        var i = 40;
 2             
 3             var a = {
 4                 i : 20,
 5                 foo : function () {
 6                     var i = 10;
 7                     return this.i;
 8                 },
 9                 foo1 : function (param1, param2) {
10                     return param1 + param2 + i;
11                 }
12             }
13             
14             var b = {
15                 i : 5
16             }
17             
18             console.log(a.foo()); //20
19             console.log((a.foo)()); //20
20             console.log((a.foo,a.foo)()); //40
21             console.log(a.foo.apply(window)); //40
22             console.log(a.foo.apply(a)); //20
23             console.log(a.foo.apply(a.foo)); //undefinded
24             console.log(a.foo1.apply(b, [2, 1])); //43
25             console.log(a.foo1.call(b, 2, 1)); //43

  很顯然,二者都是替換方法中this指向的對象,在參數上第一個參數就是替換後的對象,在第一個以後的參數就是調用方法所引用的參數。可是二者的區別就在於,apply方法的參數只有兩個,第一個是替換後的對象,而第一個參數是一個數組,用於存放調用方式所引用的若干個參數而call方法的參數按照順序是:替換後的對象,調用方法的參數1,以及若是有的話還有參數2……也就是將所要傳的參數排列在第一個參數以後,總的參數的數目是不必定的函數

  若是還不清楚的話,直接看定義:this

  call方法: 
  語法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
  定義:調用一個對象的一個方法,以另外一個對象替換當前對象。 
  說明: 
  call 方法能夠用來代替另外一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。 
  若是沒有提供 thisObj 參數,那麼 Global 對象被用做 thisObj。 

  apply方法: 
  語法:apply([thisObj[,argArray]]) 
  定義:應用某一對象的一個方法,用另外一個對象替換當前對象。 
  說明: 
  若是 argArray 不是一個有效的數組或者不是 arguments 對象,那麼將致使一個 TypeError。 
  若是沒有提供 argArray 和 thisObj 任何一個參數,那麼 Global 對象將被用做 thisObj, 而且沒法被傳遞任何參數。spa

  bind的用法.net

  bind方法一樣是將方法中this指定的對象替換爲特定的對象,可是不一樣的是調用bind方法時返回的是一個函數,調用這個函數時,this所指定的對象就是bind方法中的參數,等因而固定了該方法所綁定(bind)的對象了。因此這個時候能夠用一個變量來存放這個返回的方法,請看代碼:code

var i = 40;

var a = {
  i :  20,
  foo : function () {
    var i = 10;
    return this.i;
  },
  foo1 : function (param1, param2) {
    return param1 + param2 + this.i;
  }
}

var b = {
  i : 5
}

console.log(a.foo()); //20
console.log(a.foo1.call(b, 2, 1)); //8

var c = a.foo.bind(b);

console.log(c); //function bound () { [native code] }
console.log(c()); //8

  能夠看到在輸出 c 時,輸出的是一個function,說明 c 是一個函數,輸出 c() 纔是運算以後的結果。對象

 

參考資料:http://blog.csdn.net/shenzhennba/article/details/17716957blog

    http://uule.iteye.com/blog/1158829get

相關文章
相關標籤/搜索