JS中 call和apply的區別和作用


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);
c、借用別的對象的方法
求數組中的最大值
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);

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM