1.JavaScript调用模式
JavaScript一共有四种调用模式(方法调用模式,函数调用模式,构造器调用模式,apply调用模式)。调用一个函数时,会停止当前函数的执行,传递控制权和参数给新函数,除了声明时定义的形参外,每个函数还会接收两个附加的参数:this和arguments。参数this在面向对象的编程中非常重要,它的值取决于调用模式。(JavaScript:the good parts)
—————
1.1 方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。
this被绑定到该对象。
1.2函数调用模式
当一个函数并非一个对象的属性时,那么它就是当做一个函数来调用。
此时this被绑定到全局对象。
解决方案是:在函数的头部,定义一个变量that,并为他赋值为this。
1.3构造器调用模式
如果在一个函数面前带上new来调用,那么背地里将会创建一个连接到该函数的prototype成员的新对象,同时this会被绑定到新的对象。
1.4Apply调用模式
apply方法让我们构建一个参数数组传递给调用参数,并且允许我们选择this的值,apply方法接收两个参数,第一个是绑定给this的值,第二个是参数数组。
———–
2.call(),apply()函数浅析
call和apply函数只是单纯地把调用的方法中的this指向第一个参数,从第二个参数开始为调用方法传递参数
eg1:
var f1=function(){
this.a='函数f1的实例的a属性'
};
f1.a='对象f1的a属性';
var f2=function(){
};//函数f2的实例没有a属性
f2.a='对象f2的a属性';
var test=function(){
alert(this.a)
};
test.call(f1);//弹出'对象f1的a属性'
test.call(new f1());//弹出'函数f1的实例的a属性'
test.call(f2);//弹出'对象f2的a属性'
test.call(new f2());//弹出undefined
eg2:
var test = 111;
function _add()
{
this.test = 444; //注释①
alert(this.test);
}
function _sub()
{
this.test = 222;
alert(this.test);
}
_add();
_sub();
_add.call(_sub); //去掉注释①:undefined 不去掉注释①:444
var d = new _add();//结果等同于_add.call(_sub);
/*
_add.call(_sub)的执行效果:执行_add函数,函数体中的this指向_sub,_sub是个函数对象,它也有它的属性
结果:
_add.call(_sub);
function _add()
{
alert(window.test);//弹出111,与alert(test)一样
this.test = 444; //注释① this指向_sub,为_sub添加了一个test属性,值为444
this();//this指向_sub,执行_sub方法,在_sub方法中,_sub中的this指向window
alert(window.test);//上一句的效果,与alert(test)一样
alert(this.test); //上一句代码为_sub添加test属性,这里等价于alert(_sub.test);弹出444
}
*/