call apply

這是個常見的面試題,特別是前端面試前端

不少人不經常使用這兩個方法,因此也很難說清楚它們的區別。面試

其實,理解這兩個方法也許確實不容易,可是單純回答這個問題卻很容易數組

只要搜一下就能夠知道:瀏覽器

這兩個方法惟一的區別,就是app

call接收的參數是用逗號分割的多個參數jsp

apply接收的參數是一個數組函數

如,this

theFunction.call(valueForThis, arg1, arg2, ...)spa

theFunction.apply(valueForThis, arrayOfArgs)prototype

 而後,還有一個區別,那就是call的速度要比apply快一點點 

http://jsperf.com/test-call-vs-apply/3

 

valueForThis是一個基礎參數:

在 fun 函數運行時指定的 this 值。須要注意的是,指定的 this 值並不必定是該函數執行時真正的 this 值,若是這個函數處於非嚴格模式下,則指定爲 null 或 undefined 時會自動指向全局對象(瀏覽器中就是window對象),同時值爲原始值(數字,字符串,布爾值)的 this 會指向該原始值的自動包裝對象。

舉個栗子:

function Person(nn){  
    this.name = nn;     
     
    this.getName = function(){  
           return this.name;  
     }; 
};  
var john = new Person('john');  
john.getName(); //output john

var jack={name : 'jack'};

john.getName.call(jack,null); //output jack

能夠這樣理解,call方法爲jack對象添加了一個getName函數

也能夠說,call方法把getName函數內部的this對象指向了jack對象

總結下就是:改變函數的execute context,也就是runtime時this關鍵字的指向。

還有一種經常使用方式,是訪問原型鏈上的方法

Array.prototype.slice.apply

詳細請看:

http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call-and-apply

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

相關文章
相關標籤/搜索