JavaScript调用模式(this的取值)以及,call(),apply()函数浅析

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
}
*/ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值