this:从JavaScript执行上下文的视角讲清楚this

174 阅读1分钟

作用域链和this是两套不同的系统,它们之间基本没太多联系。在前期明确这点,可以避免你在学习 this 的过程中,和作用域产生一些不必要的关联。

执行上下文中包含了变量环境、词法环境、外部环境,但其实还有一个 this

image.png

this 是和执行上下文绑定的,也就是说每个执行上下文中都有一个 this。

三种方式改变函数执行上下文中的 this 值:

  1. 通过函数的 call、bind和apply方法设置

  2. 通过对象调用方法设置 myObj.showThis() // this > myObj

    var foo = myObj.showThis foo() // this > window

    在全局环境中调用一个函数,函数内部的 this 指向的是全局变量 window。通过一个对象来调用其内部的一个方法,该方法的执行上下文中的 this 指向对象本身。

  3. 通过构造函数中设置

function CreateObj(){  
    this.name = " 极客时间 "
}  
var myObj = new CreateObj()

当执行 new CreateObj() 的时候,JavaScript 引擎做了如下四件事:

首先创建了一个空对象 tempObj;

接着调用 CreateObj.call 方法,并将 tempObj 作为 call 方法的参数,这样当 CreateObj 的执行上下文创建时,它的 this 就指向了 tempObj 对象;

然后执行 CreateObj 函数,此时的 CreateObj 函数执行上下文中的 this 指向了 tempObj 对象;

最后返回 tempObj 对象。