JavaScript 堆(heap)栈(stack)概念

今天突然和同事讨论起了栈和堆的问题,我对堆栈的概念很模糊, 我认为栈和堆里一个存储的基本类型一个存的就是引用类型(引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象)

但是又想了想好像不太对!因为栈和堆的分配是指 C 或 C++ 编译的程序 ,但是由于

JS脚本引擎是一种由 C 或 C++ 开发的“应用”

而且这种脚本“应用”并不再经过 C/C++ 编译器编译, 所以这种“应用”内变量所处位置并不好说!可推导出某Script内局部变量\参数为 C/C++内某种

具体值类型的话,可能还是会放置在栈区的吧

然而通常前端工程师应该压根不关心这个(这种层面上的栈/堆)……

为什么会有栈内存和堆内存之分?

     通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

     当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

     当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

最后推荐大家用这个工具 latentflip.com/loupe   可以帮助你了解其工作原理JavaScript的调用堆栈/事件循环/回调队列是如何相互交互的

你可能感兴趣的:(JavaScript 堆(heap)栈(stack)概念)