1、堆内存释放问题:
/**
* 1、什么时候会产生堆内存:
* 创建一个引用类型的值就会产生一个堆内存;
*
* 2、堆内存如何释放:
* (1)如果当前创建的堆内存,不被其他东西占用;
* 浏览器会在空闲的时候,查找每一个内存的引用状
* 况;不被占用的都会被回收释放掉;
*/
let obj = {
name: 'xxx'
}
let temp = obj;
// 这个时候形成的堆内存被obj和temp占用着,所以不会销毁;
// 如果我们想要释放这个堆内存,需要手动解除变量和值得关联;
obj = null;
temp = null;
// 这样,浏览器检测时,堆内存就不被占用,可以释放;
2、栈内存释放问题:
/**
* 1、什么时候会产生栈内存:
* (1)打开浏览器形成的全局作用域是栈内存;
* (2)手动执行函数形成的私有作用域是栈内存;
* (3)基于ES6的Let/Const形成的块级作用域是栈内存;
*/
/**
* 2、全局栈内存的销毁:关闭页面的时候会销毁;
*/
/**
* 3、私有栈内存的销毁:
* (1)一般情况下,函数只要执行完成,执行时形成的
* 私有栈内存就会被销毁释放掉(排除出现无限级递归和
* 和死循环的情况);
*
* (2)但是一旦栈内存中的某个东西(一般都是堆地址)
* 被私有作用域之外的事物给占用了,则导致当前的私有
* 栈内存不能被立即释放销毁掉(特点:私有作用域中的
* 私有变量等信息也被保存下来了);
*/
(1)
function fn () {
}
fn();
(2)
function X () {
return function () {
// ......
}
}
网友评论