javascript 堆栈理解
所谓常说的堆栈就是,堆是堆,栈是栈,堆不是栈,栈也不是堆。
从大的方面讲他们只是宿主浏览器为每个网页分配的一块内存空间,这块内存空间称为堆栈内存,
堆栈是具体的堆内存和栈内存组合起来的一个称谓,可不要被这个给搞蒙了。
JavaScript内存分为两部分
① 堆内存:存储引用数据类型值(json对象,数组,字符串代码)
② 提供js代码的执行环境和储存基本类型值 (js的代码执行都在栈内存内执行)
栈内存
浏览器会在计算机内存中分配一块内存,专门用来供代码执行=》栈内存ECStack(Execution Context Stack)执行环境栈,每打开一个网页都会生成一个全新的ECS
ECS的作用 提供一个供JS代码自上而下执行的环境(代码都在栈中执行) 由于基本数据类型值比较简单,他们都是直接在栈内存中开辟一个位置,把值直接存储进去的,当栈内存被销毁,存储的那些基本值也都跟着销毁
全局对象GO (Global Object)浏览器端会让WINDOW指向GO
浏览器把内置得一些属性方法收到一个单独得内存中堆内存(Heap)任何开辟得内存都有一个16进制得内存地址,方便后期找到这个内存
堆内存释放:让所有引用堆内存空间地址的变量赋值为null即可,灭有变量占用这个堆内存了浏览器会在空闲的时候把它释放
栈内存释放:
一般情况下,当函数执行完成,所形成的私有作用域(栈内存)都会自动释放掉,在栈内存中存储的基本值也都会释放掉,但也有特殊不销毁的情况:(如果当前栈内存没有被释放,那么之前在栈内存中存储的基本值也不会被释放。能够一直保存下来)
①函数执行完成,当前形成的栈内存中,某些内容被栈内存以外的变量占用了,此时栈内存不能释放,一旦释放外面找不到原有的内容了
②全局栈内存只有在页面关闭的时候才会被释放掉
为什么会有栈内存和堆内存之分?
通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

浙公网安备 33010602011771号