this
JS中this很难理解它的绑定,那我们为什么还需要用到它呢,可以不用么?
this的作用简述
在执行代码时候,比如说函数中的需要取某个上下文的变量,一般来说我们是通过某种方式首先获取到这个上下文对象,然后可以取到变量;常见的可以通过两种方式取上下文对象:
- 函数中通过参数显式传入
- 函数中this默认绑定的上下文对象
在代码复杂度较大的情况下, 显式传入方式会导致代码很乱,很难维护
排除误解
-
this
和词法作用域无关,this
的绑定和函数声明的位置没有任何关系
this是什么
this
是在运行时进行绑定的,并不是在编写时绑定,它的上下文取决于函数调用时的各种条件。this
的绑定和函数声明的位置没有任何关系,只取决于函数的调用方式。当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息。this
就是这个记录的一个属性,会在函数执行的过程中用到。 ——《你不知道的JS》
调用位置
- 函数的
this
是在调用时被绑定的,完全取决于函数的调用位置
(也就是函数的调用方法)。
调用位置就是函数被执行的时候所处的位置
绑定规则
默认绑定 无法应用其他绑定规则的时候使用的默认规则
隐式绑定
person.name()
方法调用位置存在上下文对象,this绑定person对象显式绑定
name.call(person)
方法通过call
,apply
等方法调用,显式传入上下文对象new绑定
new Person()
执行时方法中的this被绑定为一个新对象,这个对象prototype会链接Person的原型
绑定例外
显示绑定 call,apply等方法传入null,undefined等值,会被忽略,而不会取绑定到this
箭头函数不应用以上绑定规则
箭头函数不使用 this 的四种标准规则,而是根据外层(函数或者全局)作用域来决定 this。 ——《你不知道的JS》