var a = xxx时,浏览器中发生了什么?

126 阅读2分钟
var a = xxx;

这是一段简单的创建变量的代码,在这段代码在浏览器中执行的时候,浏览器做了些什么呢?

  • 代码执行过程

    • 浏览器开辟内存
      浏览器会在计算机内存(内存条)中开辟出一块内存(栈内存),专门用来执行js代码
    • 词法分析
    • 变量提升
    • 代码执行
      1. 创建值xxx
      2. 声明变量a
      3. 将变量a和值xxx关联到一起
  • xxx的值不同时

    1. 当xxx是基本数据类型时
      • 计算机在其内存中开辟一块儿内存(栈内存),我们成为 执行环境栈ECStack(Execution Context Stack)
      • 再次开辟一块儿内存,形成全局上下文EC(G):Execution Context(Global) 用来区分不同区域的代码执行
        • 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
          • 作用:
            存储全局上下文中的全局变量
      • EC(G)执行进栈操作,进入到执行环境栈ECStack中
      • 代码执行
        • 创建值xxx,将xxx直接存放到EC(G)中
        • 声明变量,将变量a存放到EC(G)中
        • 将a和xxx关联到一起
      • 代码执行完毕,进行出栈操作
    2. 当xxx是引用类型
      • 计算机在其内存中开辟一块儿内存(栈内存),我们成为 执行环境栈ECStack(Execution Context Stack),
      • 再次开辟一块儿内存,形成全局上下文EC(G):Execution Context(Global) 用来区分不同区域的代码执行
        • 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
          • 作用:
            存储全局上下文中的全局变量
      • EC(G)执行进栈操作,进入到执行环境栈ECStack中
      • 代码执行
        • 创建值xxx,开辟一块儿堆(heap)内存,把xxx内容存放到堆内存中,产生一个16进制的堆内存地址
        • 声明变量,将变量a存放到EC(G)中
        • 将a和创建值中产生的16进制地址关联到一起(当发生改变的时候是堆内存中的内容发生改变)
      • 代码执行完毕,进行出栈操作
    • 栈内存作用:执行代码 & 储存基本数据类型值
    • 堆内存作用: 储存引用类型值