如何改变this指向?
在接触this指向问题,相信很多同学都面临this指向的问题,有些时候我们在对象方法内部使用this。而并不想让this指向当前本对象,这时候该怎么办呢?答案就是改变this指向,该如何改变this指向呢,请往下看。
①call()在调用时改变this指向
var x = 2;
var obj = {
x:1,
say:function(a){
var sum = this.x+a
console.log(sum);
}
}
obj.say.call(window,2); //4
在上一篇博客写到常用的三种this指向问题,this是在对象方法内部的,所以this应该是指向obj,然后在下面调用的时候使用了一个call方法,将this指向改变到了window,也就是全局。所以当调用say方法会打印外部的x,也就是2。我们又在调用时向函数内部传入了一个参数,所以函数内部的this.x就是2传入一个2所以sum的值就是4
call()方法的具体用法
call()方法是在调用时改变this指向,括号内部的第一个参数是要指向的对象,第二个参数是调用函数的实参,如果有多个参数就依次在后面传入。
②apply()调用时改变this指向
var x = 2;
var obj = {
x:1,
say:function(a){
var sum = this.x+a
console.log(sum);
}
}
obj.say.apply(window,[2]);//4
上面已经说了call和apply传参方式不同,apply给函数传参是以一个集合的形式传入,如果是多个参数,就在集合内部依次写入
③bind()定义时改变this指向
var x = 2;
var obj = {
x:1,
say:function(a){
var sum = this.x+a;
console.log(sum);
}
}
var obj2 = obj.say.bind(obj);
obj2(0);//1
bind()和call()传参方式相同,但是何时改变this指向不同。bind()方法是在定义时改变this指向。如上代码所示,定义obj2的时候将obj里的say的方法赋给给了obj2,此时obj2就是一个函数。因为暴露在全局,所以obj2的this是指向window也就是2.我们要让obj2也指向obj。就在赋值的时候bind一下,此时在调用obj2。打印结果就是1 指向了obj。
总结
①改变this指向常用的三个方法:call(),apply(),bind();要注意谁是在调用时改变this指向,谁是在定义时改变this指向
②就是参数问题,apply第二个参数就以一个集合形式传入,而call和apply都是依次传入。