this 指向
普通函数中的this指向
- 直接调用
function fn(){
console.log(this.a);
}
var a=1;
fn(); // 1
对于直接调用函数fn的情况,无论fn函数被放在哪里,在非严格模式下,this都是指向window;
- 对象调用
function fn(){
console.log(this.a);
}
const obj = {
a:2,
fn:fn
}
obj.fn() // 2
对于 obj.fn() 这种情况调用情况来说,谁调用了fn,this指向就指向谁,所以这里this指向对象obj
- new
function fn(){
console.log(this.a);
}
const f = new fn();
对于new一个构造函数实例这种情况来说,this永远绑定在实例f上,后续谁调用了fn,都不会修改this指向,this指向在new一个实例时就已确定。
箭头函数的this指向
箭头函数没有自己的this指向,其会往作用域链往上寻找,找到最近一个非箭头函数作用域中的this,然后继承这个this指向。
this指向优先级(按优先级递减)
(1)new,this指向直接绑定实例;
(2)abc 函数,可以修改this指向;
(3)obj.fn();this指向直接调用者;
(4)fn();非严格模式下指向 window;
(5)特别地,箭头函数的 this 一旦被绑定,就不会再被任何方式所改变。
使用abc函数修改this指向
1.call:第一个参数为新的this指向,其余参数为普通参数;直接执行
call: fn.call(target, 1, 2)
- apply:第一个参数为新的this指向,第二个参数为一个数组,只有两个参数;直接执行
apply: fn.apply(target, [1,2])
- bind:第一个参数为新的this指向,其余参数为普通参数;返回待执行函数,不会直接执行
bind: fn.bind(target)(1,2)
特别注意:使用bind修改函数的this指向时,不管bind几次,都由第一次决定。若第一个参数为空,则默认为window