JS中的this指向

首先我们应该明白js中的this是在代码运行期进行绑定的,这也是js中的this具备多重含义的原因。
window中的方法就是全局函数,
window中的属性就是全局变量。
在es6之前,this的指向取决于函数的调用方式,有以下几种调用方式:
1.函数调用
2.方法调用
3.构造函数的调用
4.上下文的调用方式

//函数调用方式
<script>
		//eg1:
		var obj={
			a:23,
			say:function(){
				console.log(this.a);
			}
		}
		var egObj=obj.say;
		var a=10;//这是(window)全局变量a;
		egObj();//等价于window.egObj();this指向window,结果为10
		//eg2:
		function fn(){
			var b=20;
			console.log(this.b);
		}
		var b=3;
		fn();//等价于window.fn();this指向全局(window),结果为3
	</script>

2.方法调用方式

<script>
		var obj={
			a:23,
			say:function(){
				console.log(this.a);
			}
		}
		obj.say();//此时this指向obj(调用该方法的对象),结果为23
		
		//eg2:
		var obj2={
			a:0,
			b:0,
			say:function(a,b){
				var sayA=function(a,b){
					//console.log(this);//this指向window
					this.a=a+b;
					console.log('sayA函数的结果:'+this.a)
				}
				sayA(a,b);//此处为函数调用方式,故this指向为window
				console.log('say函数的打印结果:'+this.a);
			}
		}
		obj2.say(2,3);//给函数传入的实参就相当于var a=2,b=3;
	</script>

3.构造函数的调用方式

<script type="text/javascript">
	function Fn(){
		return new Fn.prototype._init();
	}
	
	Fn.prototype={
		constructor:Fn,
		length:12,
		_init:function(){
			console.log(this.length);
		}
	}
	Fn();//结果为undefined
	//因为_init以构造函数的形式调用,其内部的this指向_init构造函数的实例
	//this只能访问函数本身的属性及实例的原型中的属性
	//首先查找函数本身,若没有,查找实例的原型对象(在实例对象的原型链中依次查找),一直找到根对象。
	//显然  _init()函数内部没有length,实例的原型对象中也没有。
	
		var obj={
			a:0,
			say:function(){
				//this.a=4;//给函数say中设置一个属性a
				console.log(this.a);
			}
		}
		var a=1;
		new obj.say();//值为undefined,若say中设置a属性,则值为4;
		obj.say.prototype.a=3;
		new obj.say();//值为3,因为say()构造函数的原型中有a属性,若say中设置a属性,则值为4;
	</script>

4.上下文的调用方式
call/applay/bind方法,切换函数执行的上下文环境,就是改变this的指向

	<script type="text/javascript">
		var obj={
			a:0,
			b:3,
			say:function(){
//				setTimeout(function(){
//					console.log(this.a);//此时为undefined;
//					//因为setTimeout()中的匿名函数的this指向window对象,所以为undefined
//					//现在想使用obj中的a属性
//					//解决如下
//					
//				},100);
				setTimeout((function(){
					console.log(this.a);
				}).bind(obj),100);//或者将obj改为this,结果为0
				//函数名.bind()只是实现了this的绑定,产生了一个新函数,并没有执行
				//或者使用自调函数直接执行
				(function(){
					console.log(this.a);
				}).bind(this)();//值也为0
			}
		}
		obj.say();
	</script>

call方法的 第一个参数:
1.若为复杂类型数据,如对象数组,则为指向的对象。
2.若为null/Undefined,this指向window;
3.若为数字,this指向Number构造函数的实例,如Number{数字}
4.若为字符串,this指向String构造函数的实例
5.若为布尔值,this指向Boolean构造函数的实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值