闭包及浏览器垃圾回收机制
GC(Garbage Collection)
GC => 浏览器的垃圾回收机制(内存释放机制)
-
栈内存释放
- 加载页面,形成一个全局的上下文,页面关闭后,全局上下文才会被释放
- 函数执行会形成一个私有的上下文,进栈执行;当函数执行完毕,大部分情况下,形成的上下文都会被出栈释放掉,以此来优化栈内存大小
- 特殊情况例子:
function fn() { var a = 100; return function () { console.log('Patrick Huang'); } } var f = fn(); f();
此时,全局变量 f 关联私有上下文中创建的函数堆,此私有上下文不会被释放
-
堆内存释放
- 查找引用(谷歌浏览器)
- 浏览器在空闲或指定时间内,查看所有的堆内存,把没有被任何东西占有的堆内存释放掉
- 占用的堆内存是不被释放的
- 引用计数(IE)
- 创建了堆内存,被占用以此,浏览器计数 +1,取消占用计数 -1
- 记录的数字为 0 时,释放此堆内存
- 某些情况会导致计数混乱,出现内存泄漏
- 查找引用(谷歌浏览器)
闭包(Closure)
- 函数执行,会形成一个私用上下文:
- 里面的私有变量,收到私有上下文的保护,不受外界干扰
- 有可能形成不被释放的上下文,里面的私有变量和一些值,就会被保存起来,这些值可以供其下级上下文使用
以上所述函数的这种保存保护机制,我们称之为闭包(Closure)
下一章会举几个例子,这一章就先给出定义
新的例子图解:
从一个例子图解彻底了解闭包机制