js栈内存与堆内存

js-stack-and-heap

概述

Javscript中内存分为栈内存、堆内存与池三类。在创建变量时,不同类型的变量会被分配到不同类型的内存当中。

栈内存(stack)

栈内存有以下特点:

  1. 大小固定
  2. “先进后出”
  3. 运行效率高

什么类型的变量会被放到栈内存当中呢?由于栈内存大小固定,所以基本类型和引用类型地址会存放大到栈内存中。在栈内存中存放的变量使用完会被立即释放。

堆内存(heap)

堆内存的大小是可变的,浏览器在必要的时候会动态给堆内存分配空间。例如,我们创建一个对象,由于在Javascript中,对象存放的数据是可变的,可能会在未来被修改,所以引用类型的数据会被存放到堆内存中,而该引用的地址会被放到栈内存中,当需要访问该对象时,js引擎会先去访问该对象的引用地址,拿到地址之后再根据该地址去堆内存中访问该对象。除此之外,闭包在创建完成后由于引用了其他变量,所以无法立即释放,也会存放到堆内存当中。