侧边栏壁纸
博主头像
woku博主等级

成功的路上并不拥挤

  • 累计撰写 50 篇文章
  • 累计创建 13 个标签
  • 累计收到 3 条评论

js中的预编译,AO,GO

woku
2022-03-07 / 0 评论 / 0 点赞 / 80 阅读 / 1,378 字

预编译

在JS脚本执行的过程中,整体过程

  1. 检查通篇的语法错误
  2. 预编译
  3. 解释一行,执行一行

发生时刻:

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

干了什么:

  1. 变量声明提升(变量赋值不提升)
  2. 整个函数体提升

eg:

变量提升:

console.log(a)
var a = '1'

预编译时找变量声明 var a 是变量声明,但是赋值不会提升

所以预编译后:

var a;
console.log(a); // undefined
a = 1;

函数提升:

    console.log(a)

    function a() {
        var a = 1
        console.log(a)
    }
    var a = 1

先找变量声明 var a;

在找函数声明,将整个函数提升

预编译后:

var a;
function a() {
   var a = 1
   console.log(a)
}
console.log(a)   // a是函数
a = 1

在预编译的过程中,函数a产生了AO

// 找形参  无
// 找变量声明  a -> undefined -> 1(执行的时候赋值)
// 找函数声明  无
AO = {
   a: undefined -> 1
}

暗示全局变量

声明变量使用 var

如果不声明直接使用,那么会默认变成全局变量

    function test() {
        var a = b = 1
    }
    test()
    console.log(b)

全局变量挂载在window 上,那么 window.b = 1

执行上下文

执行上下文的简单理解就是代码执行的一个环境的抽象。

当执行一个函数的时候,要做一些准备工作,比如上面的预编译。这个“准备过程”也可以认为是“执行上下文(execution context)”

variable object

在每一个执行上下文中都会分配一个变量对象 (variable object)

这个变量对象的属性会由在预编译时候的变量声明提升和函数声明构成

在函数执行上下文中,参数列表也会被加进去。

GO

GO (global object) 全局执行上下文

  1. 找变量声明
  2. 找函数声明
  3. 执行

简单来说:GO === window 全局执行的环境

console.log(a,b)
function a() {}
var b = function(){}

找变量

GO = {
   b: undefined
}

找函数声明

GO = {
   a: function a(){}
   b: undefined
}

执行的时候,a 是一个函数,但是b此时还没有赋值,所以是undefined

AO

前面提到过在预编译时,函数在预编译时会产生一个AO对象(Activation Object)(函数执行上下文)

AO里面做了什么

  1. 寻找函数的形参和变量声明,将形参和变量声明作为属性名存入AO对象,值都是undefined
  2. 实参值赋值给形参
  3. 找函数声明,将整个函数体提升
    function test(a) {
        console.log(a)
        var a = 1
        console.log(a)

        function a() {}
        console.log(a)
        var b = function() {}
        console.log(b)

        function d() {}
    }
    test(2)

预编译过程

找函数形参和变量声明

AO = {
    a: undefined,
    b: undefined
}

实参赋值给形参

AO = {
   a: 2,
   b: undefined
}

寻找函数声明,赋值函数体

AO = {
   a: function a(){},
   b: undefined
   d: function d(){}
}

开始执行函数

AO = {
   a: 1,
   b: function(){}
   d: function d(){}
}

最终打印结果

ƒ a() {}
1
1
ƒ () {}
0

评论区