JS this在四个过程中的指向

1.函数预编译过程 this指向window

举例:

<script>
function test(c){
 var a=123;
 function b(){}
 console.log(this);
}
test(1);
</script>

函数预编译时,会生成一个AO对象(Activation Object活动对象/执行期上下文)

	AO{
	   //变量声明提升
		a:undefined,
		//形参以及赋值
		c:1,
		//函数声明提升并赋值
		b:function(){}
   	  }

但实际上AO对象中不止存储了这些,AO中还有实参列表arguments[]和this(这里的this指向window)

	AO{
	    //变量声明提升
		a:undefined,
		//形参以及赋值
		c:1,
		//函数声明提升并赋值
		b:function(){},
		arguments:[1],
		this:window
	  }

在test函数中输出的this 和window相同
在这里插入图片描述
如果把test当作构造函数来创建对象,this将不再指向window,而是会在系统内部隐式的生成this指向创建出来的对象

var this = Object.create(test.prototype);

2.全局作用域里this指向window

在控制台直接打印this,会输出全局作用域里的this
在这里插入图片描述

3.call/apply方法可以改变函数运行时this指向

call/apply方法

4.obj.func(); func()里面的this指向obj

哪个对象调用的方法,这个方法中的this就指向哪个对象

var obj = {
	a:function(){
		console.log(this.name)
	},
	name:'abc'
}
obj.a();

对象obj调用的方法a,则a方法中的this就指向obj对象,会输出obj对象的name属性
在这里插入图片描述
如果没有用对象调用方法,则方法里的this指向window

var foo = '123';
function print(){
	var foo = '456';
	this.foo = '789';
	console.log(foo);
}
print();

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值