一文弄懂this指向

162 阅读2分钟

前言

emm,文章可能有点标题党了,但是这篇文章是笔者在学习的过程中的一些疑问、误解以及一些总结。笔者水平有限,如有错误,欢迎勘正。

this是什么?

this是什么?首先要摆脱的两个误区:

  1. this不是指向当前作用域,访问this上的属性,没有找到时,也更不会向上级作用域查找。
  2. this也不指向自身。

this是在函数被调用时发生的绑定,它指向什么完全取决于函数在哪里被调用。

如何确认this绑定?

嗯,现在摆脱了那两个误区以后,就该确认this的绑定了。网上已经有很多讲解this的博客,还有像<<你不知道的javascript(上卷)>>里介绍的,默认绑定、显式绑定、隐式绑定、new绑定等等,很详细,但是笔者今天想以一个更为简洁的方式介绍一下如何确认this。

Ecma规范中表明,函数对象有一个叫[[call]]的内部方法,函数的执行其实是通过这个[[call]]方法执行的,这个方法接收两个参数thisArg和argumetsList,thisArg和this的指向则有着密切的联系。argumentsList表示函数的实参列表。thisArg绑定的情况如下:

  1. 普通方法调用thisArg为undefined
  2. 通过call和apply调用,thisArg为第一个参数
  3. 通过对象调用,thisArg指向该对象
  4. 在构造方法中,thisArg为新构造的对象。

而this和thisArg的关系如下:(译)

  1. 如果在严格模式下,this和thisArg的则指向一致
  2. 否则,如果thisArg的值为null和undefined,this则指向全局对象。
  3. 如果thisArg不是对象类型,则将this绑定至toObject(thisArg)
  4. 其余情况this和thisArg保持一致

至此,this指向一清二楚了,这样也解释了几种会改变this指向的情况,call、apply、new等。把这两段话结合一些实际的例子看也就一清二楚了。

参考文章

segmentfault.com/a/119000000… es5.github.io/#x10.4.3