参考文档:MDN-this
在JavaScript中,this 是一个 关键字,它指向 当前执行上下文 中的对象。具体来说,this 的值取决于当前代码的执行环境:
全局执行上下文中指向全局对象函数执行上下文中由调用点决定调用点,亦即函数的调用方式,如直接调用,作为对象的方法调用,call/bind/apply调用,构造函数new
指的是直接调用函数,或者在全局作用域直接使用属性 this.xxx
默认绑定和上层作用域的this不是一回事,
默认绑定是指直接调用函数时,没有显式绑定this的情况下,使用的this
函数(非箭头函数)被当作对象的一个方法来调用
就是分别使用 bind、apply、call方式,显式绑定this
super是一个关键词,特殊语法当一个函数以 super.method() 的形式被调用时,method 函数内的 this 与 super.method() 调用周围的 this 值相同,通常不等于 super 所指向的对象。这是因为 super.method 不是像上面的对象成员访问——它是一种特殊的语法,有不同的绑定规则。有关示例,请参见 super 参考。
对于每一种绑定方式,都有自己的优先级,优先级高的会覆盖优先级低的
new绑定 > 显式绑定 > 隐式绑定 > 默认绑定
对于显式绑定
bind > apply == call
箭头函数里没有绑定自己的this,如果在箭头函数使用了this,调用的时候会到上层作用域中查找this,就像普通变量查找一样的规则
基本思路,使用隐式绑定,给传入的thisArg转换成一个对象,给新的对象添加一个属性fn,值为this,
this即为调用者,也就是调用的函数,然后使用传入的thisArg去调用原来的函数
this 的设计是为了让函数能够根据调用者灵活地执行操作。
箭头函数:
普通函数: