美文网首页
三类闭包实例理解闭包为什么会占用内存以及如何让闭包不占用内存

三类闭包实例理解闭包为什么会占用内存以及如何让闭包不占用内存

作者: 砖用冰西瓜 | 来源:发表于2017-06-25 22:22 被阅读243次

在试图弄清这个问题之前,先要理解栈内存、堆内存和预处理

占用内存,不会销毁的闭包实例

例1:

var num = 12;
function fn() {
    var num = 100;
    return function () {
        console.log(num);
    }
}
var f = fn();
f();

例1的图示

未被占用的堆内存才会被销毁

所以,正如图中椭圆形关键点中说明的那样,堆内存xxxfff111被返回给了全局变量f,而全局变量只有在窗口关闭的时候才会销毁,因此堆内存xxxfff111将一直被占用而不会销毁,定义它的局部作用域A也不会被销毁。

例2

var oDiv = document.getElementById("div1");
~function() {
    oDiv.onclick = function() {

    }
}();

这段代码的特点是:私有作用域给DOM元素的事件绑定一个方法。

例2的图示:

正如图中椭圆形关键点所说,标签对象的属性里面会自带一个onclick的属性,未被赋值时其值为null。那么,在自执行函数执行的时候,其创建的作用域所占用的堆内存xxxfff111同样也会被全局的堆内存xxxfff000占用(这里要注意,是堆内存占用堆内存),所以堆内存xxxfff111和栈内存A都不会被销毁。

不占用内存,立即销毁的实例

只需要将例1稍作修改。

例3:

function fn(){
    var num = 100;
    return function(){
        console.log(num);
    }
}
fn();   //主要修改在这里

例3的图示

由于在函数fn中,xxxfff111是被return的,所以栈内存A的预解释不会处理xxxfff111,它只在fn函数执行的时候才会生成,而函数fn的栈内存A每次被执行之后都会被销毁。

暂时占用内存,延时销毁的闭包实例

将例3稍作修改,就变成了延时销毁的闭包实例。

例4:

function fn(){
  var num = 100;
  return function(){

  }
}
fn()(); //这里到底发生了什么?其实是执行了一次fn之后,把返回的子函数有执行了一次,所以在子函数执行的时候,栈内存fn()是不能销毁的,但是子函数执行完毕后因为没有被占用,所以最终还是要被销毁的,所以最终fn()还是会被销毁的。

例4的图示:

正如途中椭圆形关键点处所说,fn()()的意思是在执行完fn()之后再把返回的值函数执行一遍。因此在子函数执行的时候,堆内存xxxfff111被占用了,相应的栈内存A也将保留。

可堆内存xxxfff111中保存的子函数在执行完成之后还是会被销毁,接着堆内存xxxfff111就作为未被占用的堆内存而被销毁,最终栈内存A也会被销毁。

所以,栈内存在执行完之后会被保留一段时间,这段时间等于其子函数执行的时间。

参考资料:

JavaScript高级程序设计(第三版)。

相关文章

  • 三类闭包实例理解闭包为什么会占用内存以及如何让闭包不占用内存

    在试图弄清这个问题之前,先要理解栈内存、堆内存和预处理。 占用内存,不会销毁的闭包实例 例1: 例1的图示 未被占...

  • 闭包与对象this

    闭包步骤 三根绿线引用导致不回收。所以AO不释放占用内存,以为AO释放导致内存泄漏 释放闭包:理论上三根线任意剪断...

  • 深入JavaScript Day04 - 闭包、this的四种绑

    一、闭包补充 1、闭包是如何导致内存泄漏的?如何解决? window【持有】了闭包函数,闭包函数【持有】了父级AO...

  • 详解Js的closure(闭包)和异步编程

    闭包 使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存...

  • 闭包的作用

    闭包:内部函数保存到外部 当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,造成内存泄漏(内存...

  • js闭包

    闭包 当内部函数被返回到外部并保存时,一定会形成闭包,闭包会产生原来的作用域链不释放,过度的闭包可能会导致内存...

  • 【推荐收藏】高频前端开发面试问题及答案整理

    说说你对闭包的理解使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存...

  • 第七节 闭包二

    一.闭包的内存 1.闭包捕捉的num相当于 类的成员变量,闭包的方法,相当于类的实例方法。 查看fn1的内存地址、...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • 常用前端知识积累

    闭包的理解 使用闭包主要是为了设计私有的方法和变量。 优点是可以避免全局变量的污染, 缺点是闭包会常驻内存,会增大...

网友评论

      本文标题:三类闭包实例理解闭包为什么会占用内存以及如何让闭包不占用内存

      本文链接:https://www.haomeiwen.com/subject/qgorcxtx.html