深入理解JS预编译——AO对象及GO对象

JS预编译

JS有两个特性,一个是单线程,一个是解释性语言。不同于编译性语言,解释性语言通常理解为不整体编译,由解释器解释一句执行一句。但JS不是直接对着代码解释执行,在解释执行之前,需要进行其他的步骤。

JS运行步骤:

  1. 语法分析
  2. 预编译
  3. 解释执行

预编译有个特点:任何变量,如果未声明就赋值,那该变量为全局变量,暗示全局变量(imply global)。并且所有的全局变量都是window的属性。

简单看一下预编译例子:

	<script>

        test();
        function test(){
   
            console.log('a');
        }
        
    </script>

正常来讲,代码执行从上到下,先执行test(),再执行后面的函数声明,所以预期结果应该是不输出a的,但是结果是输出a的。
在这里插入图片描述

再看一个例子:

    <script>
        console.log(a);
        var a = 123;
    </script>

a的声明在后,按道理应该报错,因为还没有到a的声明赋值,并不存在a变量,但是运行结果为:undefined
在这里插入图片描述
这就是因为JS在执行前,先进行了预编译。

AO对象

AO对象全称为:activation object (活跃对象/执行期上下文),在函数执行前执行函数预编译,此时会产生一个AO对象,AO对象保存该函数的参数变量。

函数预编译步骤
  1. 产生AO对象

  2. 将函数的参数以及函数里面声明的变量当做AO对象的属性名,值全部为undefined。

  3. 将实参的值赋值给形参。

  4. 在函数里面声明的函数,函数名作为AO对象的属性名,值赋值给函数体。(若参数名和函数名重叠,则函数体值会覆盖参数值)

实战理解
    <script>
        function test
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值