#26 闭包

11 篇文章 0 订阅
6 篇文章 0 订阅

什么是闭包
(一) 概念:闭包是指在 JavaScript 中,内部函数总 是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。(闭包是指有权访问另一个函数作用域中的变量的函数)

闭包的特点

(一) 使用闭包有一个优点,也是它的缺点:就是可 以把局部变量驻留在内存中,可以避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,所以推荐使用私有,封装的局部变量)。

闭包的原理 (一) 闭包就是定义在函数中的函数,是函数内外部 连接的桥梁。闭包的意义是:当前作用域总是能够访问外部作用域中的变量;函数是唯一拥有自身作用域的结构,所以闭包的创建依赖于函数。

五、闭包的应用场景
(一) 保护函数内的变量安全
(二) 在内存中维持一个变量。
(三) 通过闭包返回局部变量
(四) 使用全局变量进行累加和
(五) 使用局部变量进行累加和
(六) 循环里的匿名函数的取值问题

 <script>
    //    function fn() {
    //        var a = 3;
    //        return function(){
    //            return a;
    //        }
    //    }
    //    (function () {
    //         var a = fn()(); //function(){return a;} 然后再调用函数块
    //         alert(a);
    //    })();



    //使用全局变量进行累加和
    //   var a = 3;
    //    function fn(){
    //         a++;
    //    }
    //    fn();
    //    console.log(a); //4
    //    fn();
    //    console.log(a); //5
    //    fn();
    //    console.log(a);  //6

    // 使用局部变量进行累加和
    //    function fn() {
    //        var a = 3;
    //        return function(){
    //            return ++a;
    //        }
    //    }
    //    (function(){
    //        console.log(fn()()); //4
    //        console.log(fn()()); //4
    //        console.log(fn()()); //4
    //    })();



    //    function fn() {
    //        var a = 3;
    //        return function(){
    //            return ++a;
    //        }
    //    }
    //    (function(){
          
    //        var me = fn();
    //         console.log(me); 
    //         console.log(me); 
    //         console.log(me);
            
    //          //会输出三个function(){   return ++a;}
    //    })();
       


    //    function fn() {
    //        var a = 3;
    //        return function(){
    //            return ++a;
    //        }
    //    }
    //    (function(){
          
    //        var me = fn(); // var a = 3 function(){return ++a}
    //         console.log(me());  //4
    //         console.log(me());  //5
    //         console.log(me());  //6
    //    })();




    // 循环里面的匿名函数的取值问题

    // function fn() {
    //     var arr = [];
    //     for(var i = 0;i<5;i++){
    //         arr[i] = function(){
    //             return i;
    //         };
    //     }
    //     return arr;
    // }
    // (function(){
    //     var list = fn(); //arr
    //     for(var i = 0,len=list.length;i<len;i++){
    //         console.log(list[i]); // function(){return i}   
    //     }
    // })();





    // function fn() {
    //     var arr = [];
    //     for(var i = 0;i<5;i++){
    //         arr[i] = function(){
    //             return i;
    //         };
    //     }
    //     return arr;
    // }
    // (function(){
    //     var list = fn(); //arr
    //     for(var i = 0,len=list.length;i<len;i++){
    //         console.log(list[i]());    //5个5
    //     }
    // })();
    






    // function fn() {
    //     var arr = [];
    //     for(var i = 0;i<5;i++){
    //         arr[i] = function(){
    //             return i;
    //         }();    //自调用 (i)给里面传不传i都是0 1 2 3 4 5
    //     }
    //     return arr;
    // }
    // (function(){
    //     var list = fn(); //arr
    //     for(var i = 0,len=list.length;i<len;i++){
    //         console.log(list[i]);    // 0 1 2 3 4
    //     }
    // })();







    // function fn() {
    //     var arr = [];
    //     for(var i = 0;i<5;i++){
    //         arr[i] = function(i){
    //             return function(){
    //                 return i
    //             };
    //         }(i);    
    //     }
    //     return arr;
    // }
    // (function(){
    //     var list = fn(); //arr
    //     for(var i = 0,len=list.length;i<len;i++){
    //         console.log(list[i]);    //五个函数块
    //     }
    // })();







    // function fn() {
    //     var arr = [];
    //     for(var i = 0;i<5;i++){
    //         arr[i] = function(i){
    //             return function(){
    //                 return i
    //             };
    //         }(i);    
    //     }
    //     return arr;
    // }
    // (function(){
    //     var list = fn(); //arr
    //     for(var i = 0,len=list.length;i<len;i++){
    //         console.log(list[i]());    //0 1 2 3 4
    //     }
    // })();



    /*
     *闭包的原理: 利用了js中的垃圾回收机制,当一个函数调用结
     * 束时,这个函数包括里面的局部变量都将会被垃圾回收机制进行回收释放,回收
     * 过程中,如果发现局部变量正在被其他函数使用,则这各局部变量将不会被释
     * 放,而是被永久保存在内存中,以供其他地方使用,所以只有当程序结束的时候
     * 才会被释放,和全局变量一样,但不会像全局变量那样造成冲突,闭包会造成内
     * 存泄漏。
     * 
     *  
     * 
    */
  </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
Running in Durability level: MAX_SURVIVABILITY [2023-06-02 14:07:25] org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: [2023-06-02 14:07:25] WorkflowScript: 26: No steps specified for branch @ line 26, column 13. [2023-06-02 14:07:25] steps { [2023-06-02 14:07:25] ^ [2023-06-02 14:07:25] [2023-06-02 14:07:25] 1 error [2023-06-02 14:07:25] [2023-06-02 14:07:25] at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310) [2023-06-02 14:07:25] at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085) [2023-06-02 14:07:25] at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603) [2023-06-02 14:07:25] at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581) [2023-06-02 14:07:25] at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558) [2023-06-02 14:07:25] at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298) [2023-06-02 14:07:25] at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268) [2023-06-02 14:07:25] at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688) [2023-06-02 14:07:25] at groovy.lang.GroovyShell.parse(GroovyShell.java:700) [2023-06-02 14:07:25] at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:142) [2023-06-02 14:07:25] at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:127) [2023-06-02 14:07:25] at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:571) [2023-06-02 14:07:25] at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:523) [2023-06-02 14:07:25] at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:327) [2023-06-02 14:07:25] at hudson.model.ResourceController.execute(ResourceController.java:100) [2023-06-02 14:07:25] at hudson.model.Executor.run(Executor.java:433) [2023-06-02 14:07:25] Finished: FAILURE
06-03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值