var a = xxx;
这是一段简单的创建变量的代码,在这段代码在浏览器中执行的时候,浏览器做了些什么呢?
-
代码执行过程
-
浏览器开辟内存
浏览器会在计算机内存(内存条)中开辟出一块内存(栈内存),专门用来执行js代码 -
词法分析
-
变量提升
-
代码执行
- 创建值xxx
- 声明变量a
- 将变量a和值xxx关联到一起
-
-
xxx的值不同时
- 当xxx是基本数据类型时
- 计算机在其内存中开辟一块儿内存(栈内存),我们成为 执行环境栈ECStack(Execution Context Stack)
- 再次开辟一块儿内存,形成全局上下文EC(G):Execution Context(Global) 用来区分不同区域的代码执行
- 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
- 作用:
存储全局上下文中的全局变量
- 作用:
- 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
- EC(G)执行进栈操作,进入到执行环境栈ECStack中
- 代码执行
- 创建值xxx,将xxx直接存放到EC(G)中
- 声明变量,将变量a存放到EC(G)中
- 将a和xxx关联到一起
- 代码执行完毕,进行出栈操作
- 当xxx是引用类型
- 计算机在其内存中开辟一块儿内存(栈内存),我们成为 执行环境栈ECStack(Execution Context Stack),
- 再次开辟一块儿内存,形成全局上下文EC(G):Execution Context(Global) 用来区分不同区域的代码执行
- 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
- 作用:
存储全局上下文中的全局变量
- 作用:
- 开辟出一块儿位置存放全局变量对象VO(G):Variable Object(Global)
- EC(G)执行进栈操作,进入到执行环境栈ECStack中
- 代码执行
- 创建值xxx,开辟一块儿堆(heap)内存,把xxx内容存放到堆内存中,产生一个16进制的堆内存地址
- 声明变量,将变量a存放到EC(G)中
- 将a和创建值中产生的16进制地址关联到一起(当发生改变的时候是堆内存中的内容发生改变)
- 代码执行完毕,进行出栈操作
- 当xxx是基本数据类型时
-
注
- 栈内存作用:执行代码 & 储存基本数据类型值
- 堆内存作用: 储存引用类型值