变量提升的原理分析

293 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

变量基础知识相关

变量包含两种不同数据类型的值

  • 原始值(基本类型的值)

    保存在栈(大小固定,不可动态伸缩)中,所以不可动态添加属性。

  • 引用值(引用类型的值)

    保存在堆(大小不固定,可动态伸缩)中,所以可以动态添加属性。

词法分析(变量提升的原理分析)
  • 阶段1:词法分析
  • 阶段2:逐行执行js代码
词法分析的具体步骤

在函数运行的瞬间,会生成一个活动对象AO。

  1. 分析函数参数

    • 将函数形参添加为AO属性,此时值为undefined
    • 接收函数的实参,并覆盖原属性值
  2. 分析变量声明/分析局部变量

    • 若AO中不存在与声明的变量所对应的属性,则添加AO属性为undefined
    • 若AO中已存在与声明变量所对应的属性,则不做任何修改(如果实参有)
  3. 分析函数声明

    • 若AO中存在与函数名所对应的属性,则不做任何修改
AO对象(在函数进入调用栈时,AO代替了VO的角色)
  • js引擎刚刚读取全部js代码时,会在内存中生成一个Active Object对象,简称AO对象。

  • 特点:

    1. 不可读、不可操作、不可获取
    2. 在函数中声明的局部变量,会成为AO对象的属性,并且属性的初始值是undefined
<script>
        var bb = 1;
        function xxfn(){
            console.log(bb);
            var bb = 123;
            console.log(bb);
        }
        xxfn();
    </script>
代码词法分析阶段js代码执行阶段
最开始AO.bb = undefined
var bb = 1;
function xxfn(){
console.log(bb);//输出undefined
var bb = 123;AO.bb = 123
console.log(bb);//输出123
}
xxfn();

例题分析

cloud.tencent.com/developer/a…

因为对象是引用变量,所以赋值是传递的地址给他,

你想想看 如果加上那行代码 然后this.sgsFlowinfoWithBLOBs会变成什么 然后 响应式就会导致缺失