如何确定this的指向

268 阅读1分钟

确定函数(方法)中的this的指向是一个很复杂的过程,也是考察候选者比较好的一个点。开发中,就直接打断点调试就行了,发现this的值不对,就改呀,改成箭头函数,或者用bind给绑定一下。但是,还是确定一些理论能力的。

原则

  1. 非箭头函数:谁调用,就指向谁;

    • new 构造器()。 构造器内部的this指向实例
    • 对象.方法()。 方法内部的this指向对象
    • 函数()。没有明确指定是谁在调用,那就理解为是window在调用,所以指向window。严格模式下就是undefined
  2. call,apply,bind可以“显示地”改变this的值

  3. 箭头函数:内部没有this,有由外层函数中的this来确定;

这里有一题,请你来看看。

let length = 20

let obj = {
    length: 100,
    fn() { console.log(this.length) }
}

obj.fn() // 1. ?

const fn = obj.fn
fn() // 2. ?

const arr = [fn, 0,1,2]
arr[0]() // 3. ?