预编译

Js运行三部剧

  • 语法分析 → 预编译 → 解释执行

预编译前奏

  • imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象(就是 window)所有。
  • 一切声明的全局变量,全是window的属性
  • window就是全局的域

预编译过程

  • 预编译发生在函数执行的前一刻

  • (函数)预编译的四部曲:

    1. 创建 AO 对象 Activation Object(执行期上下文,作用是理解的作用域,函数产生的执行空间库)
    2. 找形参和变量声明,将变量和形参名作为 AO 属性名,值为undefined,相当于
     AO{
    a : undefined,
    b : undefined
    }
    
    1. 将实参值和形参统一(把实参值传到形参里)
    2. 在函数体里面找函数声明,值赋予函数体

一旦有重名的,一但有a变量又有a函数【如 function a (){},又在第一条访问的是a,一定是函数

全局的预编译三部曲:

  1. 生成了一个 GO 的对象 Global Objectwindow 就是 GO
  2. 找形参和变量声明,将变量和形参名作为 GO 属性名,值为 undefined
  3. 在函数体里面找函数声明,值赋予函数体

任何全局变量都是 window 上的属性
没有声明就是赋值了,归 window 所有,就是在 GO里面预编译

先生成 GO 还是 AO?
想执行全局,先生成 GO,在执行 test 的前一刻生成 AO
在几层嵌套关系,近的优先,从近的到远的,有 AO就看 AO,AO 没有才看 GO

AO上面有就用 AO的,没有就看 GO

posted @ 2020-03-24 21:02  懒惰ing  阅读(193)  评论(0编辑  收藏  举报