this 的指向

不管是什么场合,this都有一个共同点:它总是返回一个对象。javascript 的 this 不是在函数定义的时候确定的,而是在调用的时候确定的,指向调用者。

const A = {
  name: '张三',
  describe: function () {
    return '姓名:'+ this.name;
  }
};

const name = '李四';
const f = A.describe;
f() // "姓名:李四" - 相当于 window 调用了

1. 方法调用

通过对象来调用其方法函数 对象.方法函数(...),函数中的 this 指向调用该方法的对象。

2. new 实例调用

在 es5 中,用 new 调用一个构造函数会创建一个新对象,而其中的 this 就指向这个新对象。

但是构造函数如果有 return 语句,且 return 语句是个对象,则 new 出来的新对象是指 return 的这个对象,如果 return 的是非对象数据类型,则 this 依旧指向 new 的新对象。

3. call/bind/apply 绑定

3.1 call()

函数实例的 call 方法,可以指定函数内部 this 的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。call 方法的参数,应该是一个对象。如果参数为空、nullundefined,则默认传入全局对象。

3.2 apply()

apply 方法的作用与 call 方法类似,也是改变 this 指向,然后再调用该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数。

3.3 bind()

bind方法用于将函数体内的 this绑定到某个对象,然后返回一个新函数。

3.4 总结

类型
调用方式
第一个参数
其余参数

bind

返回一个函数

this指向改变后的对象

直接传递

apply

函数直接调用

this指向改变后的对象

用数组包裹参数

call

函数直接调用

this指向改变后的对象

直接传递

4. 箭头函数中的 this

箭头函数中使用的 this,其实是直接包含它的那个函数或函数表达式中的 this。函数体内的this对象,是定义时所在的对象,而不是使用时所在的对象。或者可以说 箭头函数没有 this。

5. 总结

this 代表函数调用相关联的对象,通常页称之为执行上下文。

  1. 作为函数直接调用,非严格模式下,this指向window,严格模式下,this指向undefined

  2. 作为某对象的方法调用,this通常指向调用的对象

  3. 使用apply、call、bind 可以绑定this的指向

  4. 在构造函数中,new 调用时指的是被构造的对象

  5. 箭头函数没有单独的this值,this在箭头函数创建时确定,它与声明所在的上下文相同

简单来说就是:

  • 普通函数的this ==> 谁调用就是谁(经常变:谁调用是谁)

  • 箭头函数的this ==> 在谁的环境下this就是谁(不变:当前作用域),例如常见document/window等

如果你对内容有任何疑问,欢迎提交 ❕issues✉️ email

最后更新于

这有帮助吗?