js中this的指向问题

初学js的是时候,觉得js中this的指向是千变万化的,无所定型,仿佛是时刻在变,至少在一个js文件里面不同地方调用this都是不尽相同的,面时中时长会有这样的提问或者面试提出现,今天一次性搞定,应付面试应该够了;
js中this的指向大致分为以下几大类:

全局上下文

非严格模式和严格模式中this都是指向顶层window对象;
在这里插入图片描述

函数上下文

普通函数

普通函数里面的this一般他的调用者;

function test(){
	console.log(this.a);// undefined
};
// 相当于window.test()
test();

但是有一点需要说明的时,当我们使用es6的let,const的赋值函数的时候,应为存在局部作用域的锁定,但他们定义变量的时候并没有给顶层对象赋值,所以表现不一致;
在这里插入图片描述

对象中的函数this

在探讨之前我们先下结论:
1.this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的;
划重点:最近的调用者,这里需要注意的是,当我们把对象中的方法赋值给一个变量时,那么根据最近原则他的this指向的是这个变量所在的环境;

// 普通对象的调用
let obj = {
    a:"张山",
    test:function(){
        console.log(this.a);  
    },
    c:{
		a:'李四',
		test:function(){
        console.log(this.a);  
      },
	}
}
obj.test();//张三
obj.c.test();// 李四
let fn = obj.c.test();
fn(); // undefined

call、apply、bind中的this指向

这里就不做多说了,我的上一篇文章已经详细说了,这三个的调用本身就是改变this的指向的,指向的就是他们的第一个参数或者js最顶层对象;

构造函数调用this指向

构造函数中的this,我们都知道指向的时实例本身;

function CreateUser(name){
    this.name = name;
    console.log(this); 
}
var result = new CreateUser('张三');// {name: '张三'}

但是我们需要注意的时,构造函数默认时有一个return操作,默认返回this,当我们的构造内涵显式的有返回的值的话,它遵循的规则时:
当返回对象的时候,这当前this指向的是这个对象,否则仍然指向的是他的实例;
另外如果返回null,null虽然也是对象,null比较另类,原因我也不知,但要也做一般处理;

// 返回对象
function CreateUser(name){
    this.name = name;
    return {};
}
const obj = new CreateUser('李四');
obj.name; // undefined;
// 返回非对象或者null,仍指向实例
function CreateUser(name){
    this.name = name;
    return 1;
}
const obj = new CreateUser('李四');
obj.name; // 李四;

原型链中this的指向

这里纯属概念的东西,原型链说白了就是对象的继承,原型链上的方法都是挂载实例上的,所以他的this指向也是指向实例的,没啥好说的,关于原型和原型链的相关概念后续文章中我会专门讲到;

箭头函数的this指向

理论上箭头函数是不存在this的,因为箭头函数在this的指向只在他的执行期间通过作用域来向上寻找,直到第一次碰到他的执行环境是,就是他的this指向;作用域链的概念大家应该熟悉吧,每个非箭头函数都有自己的作用域,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值