Voyz's Studio.

执行上下文、变量对象、作用域链与闭包

字数统计: 458阅读时长: 1 min
2021/04/25 Share

执行上下文、变量对象、作用域链与闭包

关系

  • 执行上下文包含:变量对象作用域链
  • 变量对象包含:arguments
  • 活动对象包含:赋值的argumentsthis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 执行上下文
testEC = {
// 变量对象
VO: {
arguments: {...},
foo: <foo reference> // 表示foo的地址引用
a: undefined
},
// (活动对象)
AO: {
arguments: {...},
foo: <foo reference> // 表示foo的地址引用
a: 1,
this: window
},
// 作用域链
scopeChain: scopeChain: [VO(innerTest),VO(global)],
}

执行上下文

  • 「定义」:函数运行时创建的 执行环境
  • 「机制」:函数执行时入栈,执行完出栈
  • 「包括」:全局执行上下文/函数执行上下文/eval执行上下文

  • 「创建」:创建 变量对象this
  • 「代码执行」:变量赋值
  • 「销毁」:执行上下文出栈、内存空间失去引用等待回收

变量对象

  • 「创建过程」:arguments => 函数声明 => 变量声明
  • 「执行」:栈顶的执行上下文, 变量对象(VO)[赋值、this]–> 活动对象(AO)

作用域链

  • 「作用域」:词法环境,写代码的时候就已经确定了
  • 「作用域链」:当前环境上层环境的一系列变量对象组成,它保证了当前执行环境对符合访问权限的变量和函数的有序访问。

闭包

  • 通过闭包,我们可以在其他的执行上下文中,访问到函数的内部变量
  • 由于作用域链中连接到了其他变量对象,因此其自身执行上下文出栈后仍未失去引用,不会被垃圾回收
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    var fn = null;
    function foo() {
    var a = 2;
    function innnerFoo() {
    console.log(a);
    }
    fn = innnerFoo; // 将 innnerFoo的引用,赋值给全局变量中的fn
    }

    function bar() {
    fn(); // 此处的保留的innerFoo的引用
    }

    foo();
    bar(); // 2
CATALOG
  1. 1. 执行上下文、变量对象、作用域链与闭包
    1. 1.1. 关系
    2. 1.2. 执行上下文
    3. 1.3. 变量对象
    4. 1.4. 作用域链
    5. 1.5. 闭包