call & apply

  對於apply和call二者在做用上是相同的:這兩個方法一般被用來類的繼承和回調函數。但二者在參數上有區別的。call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。web

如 func.call(func1,var1,var2,var3) 對應的apply寫法爲:func.apply(func1,[var1,var2,var3])ajax

 
  call和apply 方法能夠用來代替另外一個對象調用一個方法。其實就是更改對象的內部指針,即改變對象的this指向的內容。若是沒有提供 第一個 參數,那麼 Global 對象被用做第一個。
除了call和apply,bind也能夠實現改變this指向的內容。
add.call(sub,4,2)就至關於 add(4,2)

注:在ES5的strict模式下,this已經被規定不會指向全局對象,而是undefinedapp

 

一、第一個參數函數

(1)this

   

(2)spa

  function Obj(){prototype

       this.value="對象!";3d

  }
  var value="global 變量";指針

  function Fun1(){對象

       alert(this.value);

  }
    window.Fun1();    //global 變量
    Fun1.call(window);   //global 變量
    Fun1.call(document.getElementById('myText'));   //input text
    Fun1.call(new Obj());    //對象!

 

二、第二個參數

  (注:sayColor()也是做爲全局函數定義的,並且當在全局做用域中調用它時,它確實會顯示」red」——由於對this.color 的求值會轉換成window.color 的求值。而sayColor.call(this)和sayColor.call(window),則是兩種顯式地在全局做用域中調用函數的方式,結果固然都會顯示」red」。可是,當運行sayColor.call(o)時,函數的執行環境就不同了,由於此時函數體內的this 對象指向了o,因而結果顯示的是」blue」。使用call()(或apply())來擴充做用域的最大好處,就是對象不須要與方法有任何耦合關係。)

 

做用1: 類的繼承

function Person(name,age){

     this.name = name;

     this.age=age;

     this.alertName = function(){

             alert(this.name);

         }

      this.alertAge = function(){

             alert(this.age);

         }

}

function webDever(name,age,sex){

         Person.call(this,name,age);    //繼承Person

         this.sex=sex;

         this.alertSex = function(){

                  alert(this.sex);

         }

}

var test= new webDever(「愚人碼頭」,28,」男」);

test.alertName();//愚人碼頭

test.alertAge();//28

test.alertSex();//男

注:Person.call(this,name,age) 的意思就是使用 Person構造函數(也是函數)在this對象下執行,那麼 webDever就有了Person的全部屬性和方法,test對象就可以直接調用Person的方法以及屬性了。

 

做用2: 回調函數
  call 和 apply在回調行數中也很是有用,不少時候咱們在開發過程當中須要對改變回調函數的執行上下文,最經常使用的好比ajax或者定時什麼的,通常狀況下,Ajax都是全局的,也就是window對象下的,來看這個例子:

function Album(id, title, owner_id) {

  this.id = id;

  this.name = title;

  this.owner_id = owner_id;

};

Album.prototype.get_owner = function (callback) {

  var self = this;

  $.get(‘/owners/’ + this.owner_id, function (data) {

       callback && callback.call(self, data.name);   //這裏使用self,由於當callback做爲普通函數調用時,this指向的是window。

  });

};

var album = new Album(1, ‘生活’, 2);

album.get_owner(function (owner) {

     alert(‘The album’ + this.name + ‘ belongs to ‘ + owner);

});

 
這裏

album.get_owner(function (owner) {

     alert(‘The album’ + this.name + ‘ belongs to ‘ + owner);

});

中的 this.name就能直接取到album對象中的name屬性了。
相關文章
相關標籤/搜索