發表於 2012年02月1日javascript
JavaScript 中經過call或者apply用來代替另外一個對象調用一個方法,將一個函數的對象上下文從初始的上下文改變爲由 thisObj 指定的新對象。簡單的說就是改變函數執行的上下文,這是最基本的用法。兩個方法基本區別在於傳參不一樣。css
這兩個方法一般被用來類的繼承和回調函數: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屬性了。