几个专有名词:
ECStack(Execution Context Stack): 执行环境栈(栈内存)
EC: Execution Context(执行上下文)
EC(G): Execution Context Global(全局执行上下文),供全局代码执行,
VO(G): 全局变量对象,用来存储当前上下文中声明的变量的(存储全局变量的),
GO: GO是一个全局对象,存放很多浏览器内置的API,浏览器端有一个叫做window的全局变量指向它: window.xxx ,
node端有一个叫做global的全局变量指向它,GO是在 堆 中开辟一块空间存放的、
VO/VO(G): 用来存储当前上下文中声明的变量的,他是一个区域 (我们可以把他理解为是栈内存空间),
VO/VO(G)是在每个执行环境上下文(EC)中的、
var a = 12;
代码执行时候拆分为以下三部分
第一步:创建一个值12,12是原始值,创建一个值要存储起来,原始值是直接存储到栈内存中的,
第二步:声明一个变量a,然后要存储起来,存储到当前上下文的VO变量对象中,
第三步:让变量与值关联在一起,关联这个操作叫定义 defined。
创建引用数据类型
var a = { n: 12 }
引用数据不能直接存储在栈内存中,要开辟一个堆内存,把引用数据的值放到堆内存中去,
引用数据值的16进制内存地址存储到栈中,让a变量名与16进制的内存地址关联在一起、
堆栈图
测试案例:
var a = 12;
function b() {};
let c = 14;
const d = function() {}
栈结构
特点:后进先出 或者 先进后出
因为:新进栈的内容在栈的顶端,这样会把之前进栈的压缩到栈的底部,出栈也是从顶端开始出,上面的不出去,下面的也出不去。