JS堆栈内存的运行机制也需时常回顾咀嚼
在js引擎中对变量的存储主要有两个位置,堆内存和栈内存。栈内存主要用于存储各种基本类型的变量,包括Boolean、Number、String、Undefined、Null,
以及对象变量的指针(地址值)。栈内存中的变量一般都是已知大小或者有范围上限的,算作一种简单存储。而堆内存主要负责像对象Object这种变量类型的存储,对于大小这方面,一般都是未知的。
栈内存 ECStack
栈内存ECStack(Execution Context Stack)(作用域)
栈内存ECStack(Execution Context Stack)(作用域)
JS之所以能够在浏览器中运行,是因为浏览器给JS提供了执行的环境栈内存
浏览器会在计算机内存中分配一块内存,专门用来供代码执行=》栈内存ECStack(Execution Context Stack)执行环境栈,每打开一个网页都会生成一个全新的ECS
ECS的作用
- 提供一个供JS代码自上而下执行的环境(代码都在栈中执行)
- 由于基本数据类型值比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存储进去的,当栈内存被销毁,存储的那些基本值也都跟着销毁
堆内存
堆内存:引用值对应的空间,堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
存储引用类型值(对象:键值对, 函数:代码字符串),当内存释放销毁,那么这个引用值彻底没了
堆内存释放
当堆内存没有被任何得变量或者其他东西所占用,浏览器会在空闲的时候,自主进行内存回收,把所有不被占用得内存销毁掉
谷歌浏览器(webkit),每隔一定时间查找对象有没有被占用
引用计数器:当对象引用为0时释放它