引言:我没有系统的学习过javascript,对this的取值分不清楚,对工作中造成很大的困难,对自己的不信心等
javascript函数调用模式分为四种:方法调用模式,函数调用模式,构造器调用模式,Apply调用模式。
1.方法调用模式
当一个函数作为一个对象的属性时,我们称它为为一个方法。当一个方法被调用时,this被绑到到该对象。
eg:
var obj = {
name:'joe',
getName:function(){
return this.name; //this指的就是obj对象
}
}
obj.getName(); //joe
方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改;
2.函数调用模式
当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用时:
var sum = add(1,2); //3
以此模式调用函数时,this被绑定为全局对象。
var obj = {
value:'123',
double:function(){
console.log(this);//obj
var that = this;
var helper = function(){
console.log(this);//window
that.value = add(that.value,that.value);
}
helper();
}
};
obj.double();
3.构造器调用模式
当一个函数前面带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会绑定到那个新对象上。
var Quo = function(a){
this.status = a;
};
Quo.prototype.getStatus = function(){
return this.status;
}
var myQuo = new Quo('joe');
console.log(myQuo.getStatus());//joe
一个函数,如果创建的目的就是希望结合new前缀来调用,那它就被称为构造器函数,按照约定,它们保存在以大写格式命名的变量里。
一般不推荐使用这个方法。
4.Apply调用模式
apply方法让我们构建一个参数数组传递给调用函数。它也允许我们选择this的值。apply方法接受俩个参数,第一个是要绑定给this的值,第二个就是一个参数数组。
var statusObject = {
status:'A-OK'
};
var status = Quo.prototype.getStatus.apply(statusObject);//'A-OK'
apply把this指向了statusObject对象,所以函数getStatus()this.status就是statusObject.status;