這是個常見的面試題,特別是前端面試前端
不少人不經常使用這兩個方法,因此也很難說清楚它們的區別。面試
其實,理解這兩個方法也許確實不容易,可是單純回答這個問題卻很容易數組
只要搜一下就能夠知道:瀏覽器
這兩個方法惟一的區別,就是app
call接收的參數是用逗號分割的多個參數jsp
apply接收的參數是一個數組函數
如,this
theFunction.call(valueForThis, arg1, arg2, ...)spa
the
Function.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