Function.prototype.apply()與Function.prototype.call()小結(jié)

字號(hào):


    JavaScript 中,某個(gè)函數(shù)的參數(shù)數(shù)量是不固定的,因此要說(shuō)適用條件的話(huà),當(dāng)你的參數(shù)是明確知道數(shù)量時(shí),用 call,而不確定的時(shí)候,用 apply,然后把參數(shù) push 進(jìn)數(shù)組傳遞進(jìn)去。當(dāng)參數(shù)數(shù)量不確定時(shí),函數(shù)內(nèi)部也可以通過(guò) arguments 這個(gè)數(shù)組來(lái)便利所有的參數(shù)
    老是忘掉這兩個(gè)東東的用下,寫(xiě)下來(lái)做個(gè)記錄吧。
    他們作用是一模一樣的,只是傳入的參數(shù)不一樣
    apply
    apply接受兩個(gè)參數(shù),第一個(gè)制定了函數(shù)體內(nèi)this對(duì)象的指向,第二個(gè)參數(shù)為一個(gè)帶下標(biāo)的集合(可遍歷對(duì)象),apply方法把這個(gè)集合中的元素作為參數(shù)傳遞給被調(diào)用的函數(shù):
    var func = function(a, c, c){
      alert([a,b,c]); //[1,2,3]
    }
    func.apply(null, [1,2,3]);
    call
    call傳入的參數(shù)不固定,和apply相同的是,第一個(gè)參數(shù)也是代表函數(shù)體內(nèi)的this指向,第二個(gè)參數(shù)開(kāi)始往后,每個(gè)參數(shù)被依次傳入函數(shù):
    var func = function(a, b, c){
      alert([a,b,c]); //[1,2,3]
    }
    func.call(null, 1,2,3);
    call是aplly的一顆語(yǔ)法糖。如果第一個(gè)參數(shù)為null,函數(shù)體內(nèi)的this指向宿主對(duì)象,在瀏覽器中是window。
    call和apply的用途
    1.改變this指向
    上面的例子就是啦
    2.Function.prototype.bind
    模擬Function.prototype.bind
    Function.prototype.bind = function(context){
      var self = this;
      return function(){
        return self.apply(context, arguments);
      }
    };
    var obj = {
      name: 'cxs'
    };
    var func = function(){
      alert(this.name); //cxs
    }.bind(obj);
    fun();