十一、闭包(堆栈内存释放问题)------ 2020-04-05

2020-04-05  本文已影响0人  自己写了自己看

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 () {
      // ......
   }
}
上一篇 下一篇

猜你喜欢

热点阅读