重学JS之执行上下文

48 阅读3分钟

执行上下文

什么是执行上下文?它定义了变量、函数的作用域以及代码的执行环境。下面将详细介绍执行上下文的相关内容 说到执行上下文那么以下几个概念不得不提及:

  1. 执行上下文栈
  2. 变量对象
  3. 作用域链
  4. this

执行上下文栈

### 执行上下文栈
对 JavaScript 代码的执行流程起着至关重要的作用。

每当 JavaScript 代码开始执行时,会创建一个全局执行上下文并将其压入执行上下文栈。之后,每调用一个函数,就会创建一个新的函数执行上下文并将其压入栈顶。当函数执行完毕后,该函数的执行上下文会从栈中弹出,控制权回到调用该函数的执行上下文。

说白了就是管理js代码执行流程。
以下两段代码可以更好的理解执行上下文栈

```var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

结果都是local scope ,但是两段代码的执行上下文栈是不同的

第一段代码:

  1. ECStack.push(checkscope())
  2. ECStack.push(f())
  3. ECStack.pop(f())
  4. ECStack.pop(checkscope)

第二段代码执行顺讯

  1. ECStack.push(checkscope())
  2. ECStack.pop(checkscope)
  3. ECStack.push(f())
  4. ECStack.pop(f())

这两段代码都是在ECStack.push(f())的时候将局部变量 scope进行赋值为 local scope

变量对象

变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明。

  1. 在全局上下文中,变量对象就是全局对象,在全局对象中内置了很多的方法,比如 parseInt()等。

  2. 在函数上下文中,我们用活动对象(activation object, AO)来表示变量对象

    活动对象和变量对象其实是一个东西,只是变量对象是规范上的或者说是引擎实现上的,不可在 JavaScript 环境中访问,只有到当进入一个执行上下文中,这个执行上下文的变量对象才会被激活,所以才叫 activation object 呐,而只有被激活的变量对象,也就是活动对象上的各种属性才能被访问。

    活动对象是在进入函数上下文时刻被创建的,它通过函数的 arguments 属性初始化。arguments 属性值是 Arguments 对象。

    函数定义时,也就是函数进入执行上下文后变量对象包括:函数的所有形参 (如果是函数上下文)、函数声明、变量声明

    代码执行时,会顺序执行代码,根据代码,修改变量对象的值

作用域链

作用域链是什么: 当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

this