Javascript的每個Function對象中有一個apply方法:
function.apply([thisObj[,argArray]])
還有一個類似功能的call方法:
function.call([thisObj[,arg1[, arg2[, [,.argN]]]]])
它們各自的定義:
apply:應用某一對象的一個方法,用另一個對象替換當前對象。
call:調用一個對象的一個方法,以另一個對象替換當前對象。
它們的共同之處:
都“可以用來代替另一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。”
它們的不同之處:
apply:
最多只能有兩個參數——新this對象和一個數組 argArray。如果給該方法傳遞多個參數,則把參數都寫進這個數組里面,當然,即使只有一個參數,也要寫進數組里面。如果 argArray 不是一個有效的數組或者不是 arguments 對象,那么將導致一個 TypeError。如果沒有提供 argArray 和 thisObj 任何一個參數,那么 Global 對象將被用作 thisObj,並且無法被傳遞任何參數。
call:
則是直接的參數列表,主要用在js對象各方法互相調用的時候,使當前this實例指針保持一致,或在特殊情況下需要改變this指針。如果沒有提供 thisObj 參數,那么 Global 對象被用作 thisObj。
更簡單地說,apply和call功能一樣,只是傳入的參數列表形式不同:如 func.call(func1,var1,var2,var3) 對應的apply寫法為:func.apply(func1,[var1,var2,var3])
也就是說:call調用的為單個,apply調用的參數為數組
function sum(a,b){ console.log(this === window);//true console.log(a + b); } sum(1,2); sum.call(null,1,2); sum.apply(null,[1,2]);
作用
a、調用函數
var info = 'tom'; function foo(){ //this指向window var info = 'jerry'; console.log(this.info); //tom console.log(this===window) //true } foo(); foo.call(); foo.apply();
b、call和apply可以改變函數中this的指向
var obj = { info:'spike' }; foo.call(obj); //這里foo函數里面的this就指向了obj foo.apply(obj);
var arr = [123,34,5,23,3434,23]; //方法一 var arr1 = arr.sort(function(a,b){ return b-a; }); console.log(arr1[0]); //方法二 var max = Math.max.apply(null,arr) //借用別的對象的方法 console.log(max);