# 1、执行环境栈
浏览器会提供一个供代码运行的环境 栈内存 ECStack(Execution Context Stack),是计算机在计算机中分配出来的一块内存。js代码在执行过程中会按照以下顺序执行。
- 执行环境栈
ECStack
- 全局执行上下文
EC(G)
- 全局变量对象
VO(G)
- 变量对象
VO
- 活动对象
AO
基本数据类型赋值的详细过程 var a=12
- 创建一个值12,把它存储起来(基本类型值存在栈内存中)
- 声明一个变量(
var a
),把它存储在当前上下文所属的变量对象中。 - 最后进行等号赋值(定义)。本质是一个指针指向的过程。
引用数据类型赋值的详细过程。var a={}
- 在计算机中开辟一个堆内存,用来存储自己的键值对,每一个堆内存都有一个16进制的地址。
- 在堆内存中分别存储键值对。
- 将16进制的地址放到栈中,供变量调用。
# 2、GC 浏览器垃圾回收机制 (内存释放机制)
# 1、栈内存:EC
- 全局执行上下文:在浏览器加载页面的时候形成,然后在页面关闭的时候释放。(页面刷新:先释放,重新加载后形成)
- 私有上下文:函数执行会形成一个私有的上下文(let/const 也会产生私有的上下文)
- 一般情况下代码执行完就会被出栈释放
- 如果当前上下文中的某个内容(一般是一个堆)被上下文以外的事物占用了,则当前上下文不能释放。
# 2、堆内存 :HEAP
谷歌浏览器按照是否被引用 来决定堆内存的释放还是不释放的:浏览器回定期间隔一段时间,查找所有堆内存是否被占用,被占用的不处理,但是如果被占用,则直接把它释放掉。(引用计数)。我们可以手动赋值为
null
的方式,来释放内存。IE浏览器时根据引用计数的方式来实现垃圾回收的:每次被占用都会计数累加,相反取消引用,则计数递减。直到计数为0,则释放内存。但是这种方式会出现急着记着就会乱的情况,然后出现 内存泄漏。