JS中内存分类
- 栈内存
用来提供一个供JS代码执行的环境,也就是作用域(全局作用域/局部作用域)
- 堆内存
用来储存引用数据类型的值,对象储存的是属性名和属性值,函数储存的是代码字符串(待考究)
堆内存
对象数据类型/函数数据类型在定义时会开辟一个堆内存,堆内存地址值被外界所引用的话,我们就说这个内存被占用,不能被销毁了。
- 内存释放(垃圾回收)
想让堆内存被释放,只需要把所有引用它的变量赋值为 null 即可。如果当前的堆内存没有被引用,那么浏览器中空闲的时候会把它销毁。
栈内存(作用域)
- 全局作用域:不销毁的作用域,只有浏览器关闭的时候才会释放。
- 局部作用域(只有函数执行才会产生局部作用域):
- 一般情况下,当局部作用域中的代码执行完毕后,当前的局部作用域都会主动地进行释放和销毁。
- 特殊情况下,当局部作用域中部分内容被当前作用域以外的东西占用了,那么当前这个作用域就无法被销毁:
- 函数执行返回了一个引用数据类型,并且在函数外面被其他变量接收(闭包)。
- 在局部作用域给DOM元素事件绑定方法,局部作用域一般也不销毁。
- 函数返回的引用数据类型没有被其他变量引用,但还需要执行一次(自执行函数),所以不立即销毁。当返回值执行完成后,浏览器会在空闲的时候销毁。
练习题
var fn = function () {
var i = 10;
return function (n) {
return n + (++i)
}
}
var f = fn()
f(10) // 21
f(20) // 32
fn()(10) // 21
fn()(20) // 31
内存分析图示意如下: