Ecstack 执行环境栈
AO:活动对象(Activation Object)- 函数内部
EC:执行环境(Execution Context)执行上下文
VO:变量对象(Varibale Object)- 全局
js 从上往下执行
-
Ecstack执行环境栈
-
EC(Global) 全局执行上下文
-Vo全局变量对象(入栈,压栈)
(赋值操作分为三部分:创建值,创建变量,把值和变量进行关联)
(基本类型存在栈里面,引用对象数据类型存在堆里面(函数也是引用对象类型)) -
函数堆(16进制的hash码值)
(函数堆在对函数进行存储时,将函数体里的内容当成是字符串)
(函数堆在对函数进行存储之前,初始化作用域(创建函数作用域[[scope]]))
([[scope]])作用域的产生一定是看函数执行上下文,执行上下文等同于函数作用域,也可理解为当前函数的执行上下文等于他的作用域) -
每个函数执行都会开辟一个独立的执行上下文(=独立的执行空间)EC(A)
(EC(A))私有的执行上下文
(每次生成的私有执行上下文都会从上往下进行压栈)
// js 函数内部存在变量提升
let a = 0, b = 0
function A(a) {
// 重新对A进行赋值
A = function (b) {
console.log(a + b++);
}
console.log(a++);
}
A(1)
A(2)
// 结果:1 4
/**
* ---一.将函数function A(a)存储在函数堆里,初始化一个16进制的hash码值地址:10X1A
* --1.存储之前初始化作用域:[[scope]]:EC(G)
* --2.内容存起来
* 形参:a
* 内容:"A = function (b) {
* console.log(a + b++);
* }
* console.log(a++);"
* ---二.将函数function A(a)的函数堆地址:10X1A放到对应的EC(G)全局执行上下文里
* ---三.作用域链:
* <EC(A),EC(G)>
* 先从自己作用域看,没有往父级找
* */
栈和堆
/** 堆
* -----函数堆10X1A--start
* ----------------------
* -------------作用域:[[scope]]:EC(G)
* 形参: a
* 内容:"A = function (b) {
* console.log(a + b++);
* }
* console.log(a++);"
* ----------------------
* -----函数堆10X1A--end
*
* -----函数堆20X2A--start
* ----------------------
* -------------作用域:[[scope]]:EC(A)
* 形参: b
* 内容:"console.log(a + b++);"
* ----------------------
* -----函数堆20X2A--end
* */
/** 栈
* -------------Ecstack执行环境栈-start
*------------------------------------
*
* -----EC(A) 私有执行上下文-start
* -----------------------------
* AO活动变量对象-start
* -------------------
* AO(A1)
* -------------------
* AO活动变量对象-end
* -----------------------------
* -----EC(A) 私有执行上下文-end
*
* -----EC(G) 全局执行上下文-start
* -----------------------------
* VO全局变量对象-start
* -------------------
* A - 20X2A
* -------------------
* VO全局变量对象-end
*
* 执行代码-start
* -------------------
* A(1)
* A(2)
* -------------------
* 执行代码-end
* ------------------------------
* -----EC(G) 全局执行上下文-end
*
* ------------------------------------
* ---------------Ecstack执行环境栈-end
* */
网友评论