对于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) {
});