JS中的this(通过几个例子可以加深理解)

1.首先说一下this指向的规则:
this的指向在函数的定义时是确定不了的,只有函数执行时才能确定this到底指向谁,实际上 this最终的指向是那个调用它执行它的那个对象。
2.下面通过几个例子加深理解一下
例子1:

function a(){
	var user = “每天脱发也不能秃”;
	console.log(this.user);  //undefined
	console.log(this);  //window
}
a();

注意,这里的a是被window ,调用的,window 并没有user 属性,所以为undefined。
例子2:

var object = {
	user:“每天脱发也不能秃”,
	fn:function(){
		console.log(this.user);  //每天脱发也不能秃
	}
}

这里的this指向的是对象object ,fn()是通过调用object执行的。
强调一下:this的指向在函数建立的时候是无法确定的,只有在调用执行的时候才能确定,谁调用执行,指向谁。
例子3(终极秘籍)

var object = {
	a:10,
	b:{
		a:12,
		fn:function(){
			console.log(this.a)
		}
	}
}
object.b.fn();  //12
object.b.fn;  //undefined

为什么会这样呢?疑惑,哈哈哈,我一开始就很疑惑,因为没有很好的理解文章第一句话。
总结一下:
1)如果一个函数中有this ,但是没有被上一级的对象调用执行,那么this就指向window。
2)如果一个函数中有this ,且这个函数被上一级调用执行,那么this指向的就是上一级的对象。
此时,我们再回过头来看,两个代码的不同之处,第一句与第二句的区别就在于,第一句调用执行了fn函数,而第二句只是调用,并没有执行,就是上面总结1,所以this还是指向window的。
3.当函数中既有this又有return时,需要注意下

function fn(){
	this.user = "秃头是不可能秃头的";
	return {}
}
var a = new fn();
console.log(a.user);  //undefined

注意:如果返回值为对象,那么this就指向那个返回的对象。

function fn(){
this.user = "秃头是不可能秃头的";
return undefined;
}
var a = new fn();
console.log(a.user);  //秃头是不可能秃头的

注意:如果返回值不是对象,那么this还是指向函数的实例,虽然null也是对象,但是this还是指向实例。
4.最后,对比一下普通函数与箭头函数中this的指向

//例子1
function foo() {
	console.log(this.a)
}
var a = 1
foo(); //1,相当于window.foo()

//例子2
var obj = {
	a: 2,
	foo: foo
}
obj.foo();  //2

//例子3
// 以下情况是优先级最高的,`this` 只会绑定在 `c` 上,不会被任何方式修改 `this` 指向
var c = new foo()
c.a = 3
console.log(c.a)

// 还有种就是利用 call,apply,bind 改变 this,这个优先级仅次于 new

注意:前两种情况,this只依赖于调用函数前的对象,优先级是第二种情况大于第一种情况。第三种情况的优先级最高。

function a() {
    return () => {
        return () => {
        	console.log(this)
        }
    }
}
console.log(a()()())

注意:箭头函数其实是没有 this 的,这个函数中的 this 只取决于他外面的第一个不是箭头函数的函数的 this。在这个例子中,不是箭头函数的第一个普通函数是a,a的this指向window,所以 this 是 window。并且 this 一旦绑定了上下文,就不会被任何代码改变,用call()或者apply()调用箭头函数时,无法对this进行绑定,因为传入的第一个参数被忽略。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值