對於apply和call二者在做用上是相同的:這兩個方法一般被用來類的繼承和回調函數。但二者在參數上有區別的。call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。web
如 func.call(func1,var1,var2,var3) 對應的apply寫法爲:func.apply(func1,[var1,var2,var3])ajax
注:在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的方法以及屬性了。
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) {
});
};
var album = new Album(1, ‘生活’, 2);
album.get_owner(function (owner) {
});
album.get_owner(function (owner) {
});