内存释放与作用域销毁
1,堆内存释放
对象数据类型或函数数据类型在定义时,会开辟一个堆内存,堆内存具有一个引用地址,若堆内存的引用地址被声明的变量引用,那该堆内存被占用,此时堆内存不能被释放。
释放方式:
使引用堆内存地址的所有变量赋值为空对象指针null。当前堆内存若没有任何变量占用,则浏览器会在空闲时间段将其销毁。
示例:
var obj1 = {name:"小二"};//创建对象,形成堆内存和地址
var obj2 = obj1;//obj1对象存在的堆内存地址赋值给obj2,此时两个变量都引用该堆内存地址
//释放堆内存地址
obj1 = null;
obj2 = null;
2,栈内存释放
2.1 全局作用域
只有当页面关闭时,全局作用域才会被释放
2.2 私有作用域
2.2.1 一般情况
函数执行形成一个新的私有作用域,当私有作用域中的代码执行完成后,当前的私有作用域会主动进行销毁
2.2.2特殊情况
当前私有作用域中的部分内存被该私有作用域以外的变量或其他内容占用,此时当前私有作用域不能销毁
2.3 不销毁情况总结
2.3.1 函数执行返回一个引用数据类型值,并且在函数以外被其他变量或内容接收,私有作用域不销毁
2.3.2 在一个私有作用域中给DOM元素的事件绑定方法,一般情况该私有作用域不被销毁
2.3.3 不立即销毁情况,被调用函数返回值返回的函数无外部变量或其他内容占用,但还需执行一次的情况,如调用函数fn()(),暂时不销毁,但返回值执行完成后,浏览器将其内存释放。
注:fun()()执行过程,首先执行fun,返回一个小函数对应的内存地址,然后紧接着让返回的小函数再执行。
示例:
function fn(){
var i = 10;
return function(n){
console.log(n + (++i));
}
}
var f = fn();//fn()函数执行,返回内部小函数引用地址给变量f
f(10); //输出21,向内部小函数传形参10,i自增一参与计算,小函数当前所在私有作用域被f变量占用,不被销毁,i保持当前自增值
f(20); //输出32,向内部小函数传形参20,i在上步计算自增值再自增一参与计算
fn()(10);//输出21,返回内部小函数引用地址,暂时不销毁当前小函数私有作用域,再传入形参10参与计算,小函数当前私有作用域销毁
fn()(20);//输出31,同上分析。上一步私有作用域被销毁,不存在i保留的值,故输出31