作用域链和this是两套不同的系统,它们之间基本没太多联系。在前期明确这点,可以避免你在学习 this 的过程中,和作用域产生一些不必要的关联。
执行上下文中包含了变量环境、词法环境、外部环境,但其实还有一个 this
this 是和执行上下文绑定的,也就是说每个执行上下文中都有一个 this。
三种方式改变函数执行上下文中的 this 值:
-
通过函数的 call、bind和apply方法设置
-
通过对象调用方法设置 myObj.showThis() // this > myObj
var foo = myObj.showThis foo() // this > window
在全局环境中调用一个函数,函数内部的 this 指向的是全局变量 window。通过一个对象来调用其内部的一个方法,该方法的执行上下文中的 this 指向对象本身。
-
通过构造函数中设置
function CreateObj(){
this.name = " 极客时间 "
}
var myObj = new CreateObj()
当执行 new CreateObj() 的时候,JavaScript 引擎做了如下四件事:
首先创建了一个空对象 tempObj;
接着调用 CreateObj.call 方法,并将 tempObj 作为 call 方法的参数,这样当 CreateObj 的执行上下文创建时,它的 this 就指向了 tempObj 对象;
然后执行 CreateObj 函数,此时的 CreateObj 函数执行上下文中的 this 指向了 tempObj 对象;
最后返回 tempObj 对象。