zoukankan      html  css  js  c++  java
  • 闭包

    好难啊!

    虽然感觉懂了,但是又感觉不懂……

    什么时候使用闭包: 只要重用一个变量,又保护变量不被污染时

    步骤: 3步:

     1. 用外层函数包裹要保护的变量和操作变量的函数

     2. 外层函数将内层函数的对象返回到外部

     3. 使用者调用外层函数,获得内层函数对象

    闭包的形成原因: 外层函数的作用域对象(AO)无法释放

      被内层函数对象引用着

    简图: 2步:

     1. 找受保护的变量,并确定其最终值

     2. 找使用变量的内层函数对象,只有内层函数才能使用受保护的变量

    闭包缺点: 比普通函数占用更多内存空间!

      解决: 闭包不再使用,要及时释放

        如何释放: 将引用内层函数对象的变量赋值为null

    <script>
    //1、用外层函数包裹要保护的变量和内层函数
    function outer(){
    var i = 1;//保护
    //2、外层函数将内层函数返回到外部
    return function(){//使用变量的函数
    console.log(i++);
    }
    }
    //3、使用者调用外层函数获得内层函数的对象
    var getNum = outer();
    //getNum:function(){console.log(i++); }
    //i本该被释放!
    getNum();//1
    getNum();//2
    i = 1;//全局变量改不了局部i,即局部i被保护
    getNum();//3
    getNum();//4
    </script>

    <script>
    function fun(){
    var n = 999;
    nAdd = function(){n++;}
    return function(){
    console.log(n);
    }
    }
    var get = fun();
    //get:function(){console.log(n);}
    get();//999
    nAdd();
    get();//1000
    </script>

  • 相关阅读:
    2021年Mysql个税计算公式,自定义函数
    安装篇-安装mysql8
    安装篇-安装Nginx
    jsconfig.json配置Webpack别名,识别@
    Avue动态校验表单的必填校验
    renren开源把时间类型Date换为LocalDate报错
    Avue的CRUD最强封装(三)
    Avue-curd通用模板(二)
    Kalman Filter算法详解
    STM32 ADC DMA 中断模式多通道读取ADC转换值
  • 原文地址:https://www.cnblogs.com/wangruifang/p/7376680.html
Copyright © 2011-2022 走看看