前端面试超高频:this指向和abc函数

119 阅读2分钟

this 指向

普通函数中的this指向

  1. 直接调用
function fn(){
    console.log(this.a);
}

var a=1;
fn(); // 1

对于直接调用函数fn的情况,无论fn函数被放在哪里,在非严格模式下,this都是指向window

  1. 对象调用
function fn(){
    console.log(this.a);
}

const obj = {
    a:2,
    fn:fn
}
obj.fn() // 2

对于 obj.fn() 这种情况调用情况来说,谁调用了fn,this指向就指向谁,所以这里this指向对象obj

  1. 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)
  1. apply:第一个参数为新的this指向,第二个参数为一个数组,只有两个参数;直接执行
apply: fn.apply(target, [1,2]) 
  1. bind:第一个参数为新的this指向,其余参数为普通参数;返回待执行函数,不会直接执行
bind: fn.bind(target)(1,2)

特别注意:使用bind修改函数的this指向时,不管bind几次,都由第一次决定。若第一个参数为空,则默认为window