深刻淺出JavaScript之call()、apply()方法

寫在前面:

隔了很長時間了,也不知道寫點什麼。最近一直在研究ES6,一直想寫出來的文章能對初學者或者是在學習JS路上有所幫助的。這就是個人初衷。前端

call、apply的做用

在JavaScript中,call()方法和apply()方法都是爲了改變函數運行時上下文而存在的,換句話說:就是爲了改變函數體內部 this 的指向。
在JavaScript中,也能夠說再OOP JavaScript思想編程中,其實最繞的地方就是:函數被定義時的上下文、運行時的上下文、上下文的改變。編程

咱們先來定義一個構造函數(constructor)而後改變指向:數組

function Fn() {}

Fn.prototype = {
    color:'red',
    say:function () {
        alert(this.color);
    }
};

var fn = new Fn();
fn.say();       //返回red

這是一個很普通的構造函數,給原型new了一個新的對象,而後添加一個屬性和方法。那麼咱們若是要再建立一個對象呢,不想給這個新的對象添加方法怎麼去公用上面這個方法呢?app

var Fn1 = {
    color:'yellow'
};

var fn = new Fn();
fn.say.call(Fn1);    //使用call()方法返回yellow
fn.say.apply(Fn1);   //使用apply()方法返回yellow

因此,能夠看出 call()和 apply()是爲了動態改變 this 而出現的,當一個對象(Object)沒有這個方法,可是其餘的Fn原型裏面有這個方法,咱們能夠藉助call或apply用其它對象的方法來操做。
你們是否是感受這個call()和apply()沒什麼差距對吧?函數

call()方法與apply()方法的差異

對於使用者而言,call與apply的做用徹底同樣,不過它們接受的參數不同:
call()方法中的其他的參數必須直接傳給函數
apply()接收兩個參數:一個參數是在其中運行的做用域,另外一個是參數數組(能夠是Array實例,也能夠是arguments對象).
也能夠理解爲其實call傳參爲固定的必須知道你有多少個參數傳進去,而apply能夠傳一個數組。學習

當明確知道傳參數量時使用call()而不肯定的時候使用apply()方法而後把參數push進數組傳遞進去,函數內部也能夠經過 arguments 這個數組來遍歷全部的參數。this

深刻理解call與apply

function box(msg) {
    alert(msg);
}
box(1); //1
box(1,2); //1

上面的這個函數就是沒有肯定實參數量,這個時候就能夠考慮使用call或者apply,剛剛講過,只有apply在不肯定的數量的時候使用最佳。prototype

function box(){
 console.log.apply(console,arguments);
};
box(1); //1
box(1,2); //1 2

這一章差很少就講完了,其實要點沒多少知識點,主要就是充分掌握了技巧與思想,JavaScript就會變的很容易。歡迎前端大牛糾正錯誤,若有錯誤我會及時改正。謝謝~code

(PS:其實一直不知道寫什麼,因此這麼長時間沒更新,若是你們想看JS哪些方面的,在我瞭解與掌握的前提下仍是能夠寫一寫的。個人郵箱:cn_brian@163.com)對象

相關文章
相關標籤/搜索