- 栈内存(stack)
存放常量 基本类型值, 如a=12 这个12就放在栈中
- 堆内存(heap)
只有一个作用,专门用来存储引用类型值,引用类型值:function、数组、 对象、 sysboml
所有堆内存都有一个可被后续查找的16进制地址
后续关联赋值的时候,是把堆内存地址给予变量操作的
- GO:全局对象(Global Object)
可以理解就是window
let globalObject = {
Math:{},
String:{},
document:{},
...
window:this
}
ECStack:Execution [ˌeksɪˈkjuːʃn] Context Stack 执行环境栈
EC:Execution Context 执行环境(执行上下文)
用来执行我们写的代码,按顺序进栈执行
VO:Varibale Object 变量对象(
理解成全局的变量对象
)
*AO:Activation Object 活动对象(函数的叫做AO,理解为VO的一个分支)(也可理解为是函数执行栈中的变量对象
)Scope:作用域,创建的函数的时候就赋予的
Scope Chain :作用域链
总结图
内存释放机制
- 谷歌浏览器 -- 垃圾回收机制(内存释放机制)
谷歌浏览器会在空闲的时候,把所有不被占用的堆内存,进行释放和销毁
- IE浏览器-- 引用计数的机制
当前堆被占用一次,就记数字1,再被占用一次,就数字累加1,当然取消占用,就数字减去1,一直到减到0则销毁释放
实践
- 变量赋值3步
- 1.创建变量 声明declare
- 2.创建值:
- 2-1:基本类型值,在栈中创建存储
- 2-2:引用类型值:
- 在堆中开辟空间
- 开辟一个存储对象中键值对(存储函数中的代码)的空间"堆内存"
- 所有堆内存都有一个可被后续查找的16进制地址
- 后续关联赋值的时候,是把堆内存地址给予变量操作的
- 3 让变量和值关联起来(赋值) 定义defined
- 举例
let a = 12;
let b = a;
b = 13;
console.log(a);
第一行代码 let a = 12
1.代码进入EC(G)全局代码执行上下文,然后在全局EC(G) global全局对象中声明a
2.因为12是基本类型值,直接在栈中创建存储
3.让变量和值关联在一起 赋值
第二行代码 let b = a;
1.代码进入EC(G)全局代码执行上下文,然后在全局EC(G) global全局对象中声明b
2.因为赋值是个变量,所以指向变量指向的值,不在重新创建
3.让b关联a的值12
第三行代码 b = 13;
1.创建值时,只要是基本类型值,都需要重新创建,即时有相等的,
例如如果创建的不是13而是12,那也会重新创建一个12
2.因为变量只能指向一个值,所以把原来指向12值,改成指向13值
3.所有输出结果 a = 12 b= 13