2.JS-堆栈内存

  • 栈内存(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 :作用域链

总结图

2.JS-堆栈内存_第1张图片
image.png

内存释放机制

  • 谷歌浏览器 -- 垃圾回收机制(内存释放机制)
    谷歌浏览器会在空闲的时候,把所有不被占用的堆内存,进行释放和销毁
  • IE浏览器-- 引用计数的机制
    当前堆被占用一次,就记数字1,再被占用一次,就数字累加1,当然取消占用,就数字减去1,一直到减到0则销毁释放

实践

2.JS-堆栈内存_第2张图片
image.png
  • 变量赋值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.让变量和值关联在一起 赋值
2.JS-堆栈内存_第3张图片
image.png

第二行代码 let b = a;

1.代码进入EC(G)全局代码执行上下文,然后在全局EC(G) global全局对象中声明b
2.因为赋值是个变量,所以指向变量指向的值,不在重新创建
3.让b关联a的值12
2.JS-堆栈内存_第4张图片
image.png

第三行代码 b = 13;

1.创建值时,只要是基本类型值,都需要重新创建,即时有相等的,
例如如果创建的不是13而是12,那也会重新创建一个12
2.因为变量只能指向一个值,所以把原来指向12值,改成指向13值
3.所有输出结果 a = 12  b= 13
2.JS-堆栈内存_第5张图片
image.png

你可能感兴趣的:(2.JS-堆栈内存)