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