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