堆内存释放:
1、对象数据类型或者函数数据类型在定义的时候都会开辟一个堆内存,堆内存内有一个引用地址,如果地址被变量引用了,那么相应的内存就被占有,就不能释放了。
2、通过将变量赋值为null(空对象指针)或其他非引用类型,那么之前定义的对象或函数就没被占用,那么浏览器就会在空余的时候释放内存。
栈内存释放:
1、栈内存包括了全局作用域和函数作用域
(1)全局作用域在浏览器加载页面的时候产生,在浏览器关闭时全局作用域栈内存被释放。
(2)函数在执行时产生一个私有作用域,函数在预编译和执行完毕后,一般会销毁作用域,释放栈内存;但存在特殊的情况:当前作用域的部分内存被作用域以外的变量所占用,那么当前的作用域就不会被销毁。
(a)函数执行返回一个引用数据类型的值,并且值被函数外的变量接收,这种情况下私有作用域一般不会被销毁。
(b)函数返回一个函数紧接着被调用,这时函数作用域“不会立即销毁”,如图:
不会立即销毁(c)通过DOM方法获得的元素或元素集都是对象数据类型,通过给元素绑定事件函数,事件函数的父级私有作用域不会被销毁。
(d)形成闭包:1、函数执行返回一个函数,并且值被函数外的变量接收,这时返回的函数的作用域链不销毁,内部函数拥有访问父级函数的权限,可以使用父级的作用域的变量,这时就形成了闭包,这是函数模式的闭包;2、函数内定义的函数没被返回,当内部函数使用了父级的变量也会形成闭包(可以在控制台查看闭包信息);3、函数内定义的对象被返回,且对象使用了函数作用域的变量,这样也形成闭包,这被称为对象模式的闭包。
闭包副作用:闭包会造成原有作用域链不释放,造成内存泄露。
闭包作用:如图
闭包作用
网友评论