Javascript 中的 call 和 apply

發表於 2012年02月1日javascript

JavaScript 中經過call或者apply用來代替另外一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。簡單的說就是改變函數執行的上下文,這是最基本的用法。兩個方法基本區別在於傳參不一樣。css

  • call(obj,arg1,arg2,arg3);call第一個參數傳對象,能夠是null。參數以逗號分開進行傳值,參數能夠是任何類型。
  • apply(obj,[arg1,arg2,arg3]);apply第一個參數傳對象,參數能夠是數組或者arguments 對象。

這兩個方法一般被用來類的繼承和回調函數:java

做用1、類的繼承:web

先來看這個例子:ajax

[code=」javascript」]數組

function Person(name,age){app

this.name = name;函數

this.age=age;post

this.alertName = function(){this

alert(this.name);

}

this.alertAge = function(){

alert(this.age);

}

}

function webDever(name,age,sex){

Person.call(this,name,age);

this.sex=sex;

this.alertSex = function(){

alert(this.sex);

}

}

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

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

test.alertAge();//28

test.alertSex();//男

[/code]

這樣 webDever類就繼承Person類,Person.call(this,name,age) 的 意思就是使用 Person構造函數(也是函數)在this對象下執行,那麼 webDever就有了Person的全部屬性和方法,test對象就可以直接調用Person的方法以及屬性了; 09年的理解解很是粗淺,呵呵。http://www.css88.com/archives/1692

做用2、回調函數:

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

[code=」javascript」]

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);

});

};

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

album.get_owner(function (owner) {

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

});

[/code]

這裏

[code=」javascript」]

album.get_owner(function (owner) {

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

});

[/code]

中的 this.name就能直接取到album對象中的name屬性了。

相關文章
相關標籤/搜索