首页 > 其他分享 >thsi作用域指向的问题

thsi作用域指向的问题

时间:2022-09-03 16:59:14浏览次数:92  
标签:thsi run 指向 pox 作用域 let obj name

this的指向问题

5大调用场景

1.普通函数
2.对象方法
3.call,apply,bind
4.class
5.箭头函数


1.普通函数中出现的this

/*
	普通函数中的this指向问题
*/
function testThis(){
	console.log(this);
}

window调用了testThis函数,所以this指向window


2.对象方法中出现this

let pox = {
	name:'小李',
	run:function(){
		console.log(this.name)  //this
	}
}
pox.run();    //pox 小李

pox调用的run,所以run方法中的this指向pox


3.class中的this指向new后的实例对象

class Person{
	//构造函数
	constructor(name,age){
		this.name = name;
		this.age = age
	}
	say(){
		//
		console.log(`我叫${this.name}年龄是${this.age}`)
	}
}

//实例化对象
let hjz = new Person('huangjiazhuo',21);
 hjz.say();    //调用person类里面的方法
 console.log(hjz);   //(name:huangjiazhuo,age:21)

在类中this指向实例化出来的对象,即new出来的那个对象,条用类里面的方法和属性


4.箭头函数中的this,指向父级上下文对象

let obj = {name:'小明'}
var name = "张三"      //不能用let来进行声明,不存在变量提升
let pox = {
	name:'李四',
	run:() =>{
		console.log(this.name)   //this
	}
}

//对象方法中的this,指向方法的调用者
pox.run();   //张三
pox.run.call(obj);  //张三
pox.run.apply(obj);   //张三
pox.run.bind(obj)();    //张三

class中的this时刻指向父级的上下文都对象,并且不可以被call/apply/bind修改


5.call()/apply()/bind()都可以改变this指向


let obj = {name:'小明'}

let pox = {
	name:'张三',
	run:function(){
		console.log(this.name)
	}
}
//对象方法中的this,指向方法的调用者
pox.run();     //pox 张三
pox.run.call(obj);    //小明   
pox.run.apply(obj);  //小明
pox.run.bind(obj)();   //小明

相同点:call()/apply()/bind()都可以改变this指向,指向第一个参数
不同点:bind()需要手动执行


总结:this在函数被调用的时候确定,this的指向,函数被谁调用了就指向谁,弄清楚函数被谁调用了

参考资料:
https://blog.csdn.net/weixin_43638968/article/details/105232090
https://www.cnblogs.com/bxynlbyx/p/14540233.html

标签:thsi,run,指向,pox,作用域,let,obj,name
From: https://www.cnblogs.com/HuangJiaZ/p/16652806.html

相关文章