作用域

全局代码执行过程

  1. 代码解析(v8引擎内部创建一个全局对象GO
  2. 运行代码

    1. 内部创建一个ECStack执行上下文栈/函数调用栈
    2. 为了执行全局代码,创建GEC全局执行上下文

ECStack(Exection Content Stack)执行上下文栈、函数调用栈

GEC(Global Exection Centent)全局执行上下文

  • VO(Variable Object),其指向GO(Global Object)全局对象
  • scopechain(作用域链)存储其父级作用域,并只由定义位置决定,而非调用位置(大多数为GO

函数代码执行过程

  1. 代码解析时,在堆内存中创建一个函数存储空间(其中存储执行环境和函数体代码),并以函数名为变量名,存储空间地址为变量值存储在父作用域中
    1. function foo(x){
    2. console.log(x);
    3. }
    4. /*
    5. 堆内存:
    6. foo(0x十六进制地址)
    7. [[scope]]:parent scope
    8. 函数体代码(console.log(x))
    9. */
  1. 在函数被调用时创建一个FEC函数执行上下文和VO活跃对象(类似GO存储作用域变量),并入栈ECStack中执行

  2. 函数执行完成后,对应FEC出栈

FEC(Functional Excetion Centent)函数执行上下文

  • VO(Variable Object),其指向AO(Actional Object)
  • scopechain(作用域链)存储其父级作用域,并只由定义位置决定,而非调用位置(大多数为GO

AO(Activation Object)活跃对象

ECMA标准

VariableEnvironment变量环境

Environment Record环境记录

02.代码执行过程-作用域链(重要) - 图1