js之this

①:常见指向

this代表的是函数运行时所在的对象,一般来说,哪个对象调用它,它就指向谁:

 var name="hmm";
        function fn(){
            console.log(this.name);
        }
        fn();//输出结果即为hmm,此时调用它的windows对象,故其指向windows,this.name就相当于windows.name,即全局变量name,值为hmm
this指向的问题案例:
var name="韩梅梅";
var xm={
    name:"小明",
    sayHi:function(){
        setTimeout(function(){
            console.log(this.name);
        },0)
    }
}
var ll={
    name:"李雷",
    sayHi:sayHi
}
function sayHi(){
    console.log(this.name);
}
sayHi();//结果为韩梅梅,由window对象调用的sayHi
xm.sayHi();//结果为韩梅梅,定时器内的函数是由windows对象调用的
setTimeout(ll.sayHi,100);//结果为韩梅梅,调用定时器里的ll.sayHi方法的是window对象,故ll.sayHi里的this指的是window
setTimeout(function(){
    ll.sayHi();
},200)//结果为李雷,window调用的是定时器的function,函数体内,调用sayHi的实质上是ll对象,this指向李雷

②:vue中的指向

在vue中,methods中的this指向是vue实例对象返回的data对象,故其可用this在methos中直接访问data对象中的变量,这是由vue的源码决定的。关于源码见:

https://blog.csdn.net/qq_41308489/article/details/120831070

更改this指向的三种方法
 --之call方法
var ll={
    name:"李雷",
    car:function(){
        console.log(this.name+"can drive car");
    }
}
var hmm={
    name:"韩梅梅"
}
ll.car.call(hmm)//结果为韩梅梅can drive car。
call将ll对象的car方法指向更改为了hmm对象,即此时call中的this指的不再是ll,而是hmm
call()参数问题
当ll对象的car方法有参数时,hmm对象想借ll的car方法就必须带着car需要的参数一起去了,规定参数以逗号分隔,写在借用对象后:
call(hmm,参数一,参数二,...)
--之apply方法
同call作用相同,但两者的参数的写法不一样,此种方法的多个参数需要用中括号包裹起来:
apply(hmm,[参数一,参数二,...])
--之bind方法
不同于前两者,bind方法调用后返回的是一个函数,想要借用别人有的,需要主动调用才可
上述代码hmm对象调用ll对象的car方法必须先把ll对象里的this指针改为hmm才可,然后再主动调用返回的bind函数:
var fn=ll.car.bind(hmm);
fn();//结果为韩梅梅can drive car

 

posted on 2022-06-23 22:19  爱敲代码的关耳  阅读(37)  评论(0)    收藏  举报