• 551 闭包,浏览器垃圾回收机制/内存收机制


    闭包:

    函数执行过程中,会形成一个全新的私有上下文,此时会产生两个机制:

    (1)保护:保护自己的私有变量不受外界干扰(操作自己的私有变量和外界没有关系);

    (2)保存:如果当前上下文不被释放【只要上下文中的某个东西被外部占用即可】,则存储的这些私有变量也不会被释放,可以供其下级上下文中调取使用,相当于把一些值保存起来了;

    我们把函数执行带来的两大作用/机制,称为闭包。

    闭包不是任何代码格式,而是函数运行的机制。【从本质讲,函数执行形成的上下文没有释放前,都是闭包,只不过大多数函数执行完后,上下文都释放掉了,有人认为这不是闭包。】

    市面上多认为:只有上下文不被释放,才是闭包,因为这样才保留下来了。

    let x = 1;
    function A(y) {
        let x = 2;
        function B(z) {
            console.log(x + y + z);
        }
        return B;
    }
    let C = A(2);
    C(3);
    


    1、项目中,如果存在大量不被释放的内存(堆/栈/上下文),页面性能会变得很慢。当某些代码操作不能被合理释放,就会造成 前端内存泄漏【高程3】。我们尽可能减少使用闭包,因为它会消耗内存。

    2、浏览器垃圾回收机制/内存收机制

    谷歌:“查找引用”,浏览器不定时去查找当前内存的引用,如果没有被占用了,浏览器会回收它;如果被占用,就不能回收。

    IE:“引用计数法”,当前内存被占用一次,计数累加1次,移除占用就减1,减到0时,浏览器就回收它。

    3、优化手段:内存优化

    手动释放:取消内存的占用即可。

    (1)堆内存:

    fn = null 【null:空指针对象】

    f = null

    (2)栈内存:

    把上下文中,被外部占用的堆的占用取消即可。

    练习题1

    let x = 5;
    function fn(x) {
      return function (y) {
        console.log(y + (++x));
      }
    }
    let f = fn(6);
    f(7); // 14 
    fn(8)(9); // 18
    f(10); // 18
    console.log(x); // 5
    



    练习题2

    let a=0,
        b=0;
    // 外层的函数A里面的匿名函数被外层的函数A外面引用,所以没有return,也是闭包
    function A(a){
        A = function(b){
            alert(a+b++);
        };
        alert(a++);
    }
    A(1);
    A(2);
    
  • 相关阅读:
    python通过openpyxl操作excel
    python实现将字符串中以大写字母开头的单词前面添加“_”下划线
    python unittest setUp 和 setUpClass 区别
    python selenium 定制启动Chrome的选项注意事项(十九)
    Python 回调函数
    python 面试题
    python 常用的模块
    MySQL通过分组计算百分比
    mybatis 动态sql 的笔记 以及标签
    resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致
  • 原文地址:https://www.cnblogs.com/jianjie/p/13851602.html
Copyright © 2020-2023  润新知