改变this指向问题

1.在指定位置定义this存为变量
在外部定义this之前,this会指向obj自身

const obj = {
	age:19,
    func:function(){
        console.log(this);
    }
}
obj.func();

在外部定义this之后,this会指向定义位置的window

let _this = this;
const obj = {
    age:19,
    func:function(){
        console.log(_this);
    }
}
obj.func();

2.延时器

const obj = {
	age:19,
    func:function(){
        console.log(this);
        setTimeout(function(){
            console.log(this);
        })
    }
 }
 obj.func();

第一次打印输出对象,第二次打印输出window
所以延时器会改变this指向,让它指向window

3.箭头函数(()=>)

const obj = {
  	age:19,
    func:()=>{
        console.log(this);
    }
}
obj.func();

此时this指向window,说明箭头函数可改变this指向

const obj = {
  	age:19,
    func:function(){
        setTimeout(()=>{
            console.log(this);
        })
    }
}
obj.func();

此时打印输出的是对象,并不是因为延时器与箭头函数共同作用,而是因为函数本身指向对象,与延时器和箭头函数无关

const obj = {
	age:19,
    func:function(){
        console.log(this);
    }
}
obj.func();

4.call()方法
语法:函数名.call(调用者, 参数1, …)

function func(a,b){
	console.log(this);
    console.log(this.age);
    console.log(a);
    console.log(b);
}
let obj1 = {
	age:"张三"
}
func.call(obj1,1,2);

正常情况下直接调用函数,打印this会直接指向window,call改变了this的指向,由call的语法可知,第一个值为调用者,this则会指向该调用者

5.apply()方法
语法:函数名.apply(调用者, [参数, …])

function func(name,age){
 	console.log(this);
    console.log(name);
    console.log(age);
}
let obj = {};
func.apply(obj,["张三",19]);

此时的this已经指向了对象,说明apply改变了this的指向
apply与call方法相似,call后面要接参数,而apply后面必须接数组,否则会报错

6.bind()方法
语法:函数名.bind(调用者, 参数, …)()

function func(name,age){
    console.log(this);
    console.log(name);
    console.log(age);
}
let obj = {};
func.bind(obj,"张三",19)();

this指向obj
call与bind相同点是都从第二个开始传入参数
bind与call和apply不同的点是,它在执行后,会返回的是改变this指向之后的新函数,要手动去执行,而call和apply是自动执行。

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值