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
浙公网安备 33010602011771号