前言

信任许多小伙伴们都被this 的指向问题所折磨过,this 它究竟指向哪啊? 今天咱们就来聊聊怎样判别this 指向哪里,一盏茶的功夫让小伙伴们高兴一整天!

文中所实例代码都运行在Chrome浏览器的Console控制台中。

在上篇文章中,咱们讲了三种this指针的绑定规则,接下来咱们讲讲剩余的两种办法,并拓展一下。

this 的绑定规则

  1. new 绑定

在以前讲结构函数的文章里,咱们讲了new关键字的作用,感兴趣的小伙伴们能够去我的主页中看看那篇文章。咱们知道,自定义结构函数中,通常运用this为实例目标增加特点和办法,如以下比如:

function Car(color) {
    this.name = 'BMW'
    this.height = '1400'
    this.lang = '4900'
    this.weight = 1000
    this.color = color
}
let car1 = new Car('pink')   // 实例目标
let car2 = new Car('green')

那此刻结构函数中的this指向谁呢?咱们来输出一下:

一盏茶的功夫带你把握烦人的 this 指向问题( 二 )

很明显,咱们的实例目标中呈现了各种的特点,所以,结构函数中的this指向new出来的实例目标自身,这个比如中this别离指向car1car2.

5. 显现绑定 — call, apply, bind

显现绑定是咱们经过call,apply,bind,改动this的指向,咱们一起来看看比如:

function foo() {
    console.log(this.a);
}
var obj = {
    a: 2
}
foo()

假如这样调用foo(),那么便是this默许绑定,this指向全局,那么输出undefined,那么咱们怎样让this指向obj,输出2呢?

1. call

function foo() {
    console.log(this.a);
}
var obj = {
    a: 2
}
foo.call(obj)

call的作用便是强行把foo中的this指向obj,咱们来输出以下来看看:

一盏茶的功夫带你把握烦人的 this 指向问题( 二 )

假如foo(x, y)中有参数传入,那咱们运用call时应该怎样样呢?

function foo(n, m) {
    console.log(this.a, n, m);  // 2 100 200
}
var obj = {
    a: 2
}
foo.call(obj, 100, 200)

2. apply apply办法跟call办法差不多,但是传入参数时需求运用数组来装

function foo(n, m) {
    console.log(this.a, n, m);  // 2 100 200
}
var obj = {
    a: 2
}
foo.apply(obj, [100, 200])

咱们来输出一下:

一盏茶的功夫带你把握烦人的 this 指向问题( 二 )

能够看出,applycall 办法都将this的指向改动了

3. bind

bind的履行成果会回来一个函数体,所以咱们需求这样写:

function foo(n, m) {
    console.log(this.a);  // 2 100 200
}
var obj = {
    a: 2
}
var bar = foo.bind(obj)
bar()

假如咱们想传入参数:

这儿咱们举个比如,传入的参数为100和200

var bar = foo.bind(obj, 100, 200)
bar()
// 或许
var bar = foo.bind(obj)
bar(100200)

箭头函数

箭头函数没有this这个概念,写在箭头函数中的this也是它外层函数的this

首要咱们来看一个比如:

var obj = {
  name: 'TOM',
  show: function() {
    var bar = function() {
      console.log(this.name);
    }
    bar()
  }
}
obj.show()

这儿bar中的this指向哪呢?因为bar()是直接调用,this的默许绑定规则,那么它指向的是全局,这儿就输出undefined

一盏茶的功夫带你把握烦人的 this 指向问题( 二 )

假如咱们这儿运用的箭头函数的话:

var obj = {
  name: 'TOM',
  show: function() {
    var bar = () => {
      console.log(this.name);
    }
    bar()
  }
}
obj.show()

箭头函数里是没有this的, 假如在箭头函数中写了this,那么this就相当于它的外层函数上面,是它外围函数的this。

上述例题中,因为bar是箭头函数,那么bar内的this就相当于在它的外层函数show上, 那么obj.show()就触发了隐式绑定规则this指向obj,this.name输出TOM

总结

this

  • this的绑定规则
  1. 默许绑定 — 函数在哪个词法作用域里生效,this就指向哪里

  2. 隐式绑定 — 当函数被一个目标所拥有,再调用时,此刻this回指向该目标

  3. 隐式丢失 — 当函数被多个目标链式调用时,this指向引证函数的目标

  4. 显现绑定 — call, apply, bind

  5. new 绑定

箭头函数

箭头函数没有this这个概念,写在箭头函数中的this也是它外层函数的this

今天的内容就到这啦,假如你觉得小编写的还不错的话,或许对你有所启发,请给小编一个辛苦的赞吧