【JS面试题】this

This:

应用场景:

  1. 作为普通函数
  2. 使用call/apply/bind
  3. 作为对象方法被调用
  4. 在class方法中调用
  5. 箭头函数

This有一句话需要记住:this取什么样的值,是在函数执行的时候确认的,不是函数定义的时候确认的。

在这里插入图片描述
Call里面可以改变this指向,在这里,call里面传递一个对象,它去打印的就是这个对象。Bind也如此;但是bind是返回一个新的函数,需要重新再去执行或者给fn2去执行;而call直接调用执行

在这里插入图片描述

  1. 1.直接执行zhangsan.sayHi();返回this即当前zhangsan这个对象。所以说this作为对象被执行,返回当前对象
  2. 2.左图,setTimeOut里面有一个函数,函数里面有this,这个this === window。因为这个时候函数被执行是setTimeout本身触发的执行,并不是zhangsan.sayHi()这种触发的方式去执行,所以这里的this就是window,作为普通函数被执行,不是作为对象的方法被执行。
  3. 3.右图中,setTimeOut里面如果写了箭头函数,this又为当前对象,为什么呢?如果在waitAgain()里面直接去打印this,那肯定和sayHi()一样,为当前对象。如果setTimeOut里面有箭头函数,箭头函数是被setTimeOut触发的,不是对象方法,但是有一点箭头函数它的this永远是取它上级作用域的this,它自己本身不会指向this。所以说箭头函数有这个特点,基于这个特点我们就可以去使用。比如说箭头函数里面的this和外边是一样的this是一样的,也就说和sayHi()里面的this是一样的,所以说waitAgain()里面的this即为当前对象。
  4. 4.记住:箭头函数里面this取值是取它上级作用域的值。

在这里插入图片描述

Class里面的this:

  1. constructor(name) {this.name = name; this.age = 20};里面的this代表就是这个创建的实例
  2. sayHi()里面this代表就是zhangsan这个实例

猜你喜欢

转载自blog.csdn.net/weixin_43352901/article/details/107528488