闭包的优点及使用闭包的注意点

news/2024/7/7 9:00:43

一. 闭包的优点:

1)  减少全局变量

 <script>
        function f(){
           var a = 0;
            return function () {
                a++;
                alert(a);
            }
        }
        var result = f();
        result(); //1
        result(); //2
</script>

2) 减少传递给函数的参数数量

<script>
        function calFactory(base){
            return function (max) {
                var total = 0;
                for(var i = 1; i <= max; i++){
                    total += i;
                }
                return total + base;
            }
        }

        var adder = calFactory(2);
        alert(adder(3)); //8
</script>

3) 封装

<script>
        (function () {
            var m = 0;
            function getM(){
                return m;
            }
            function setM(val){
                m = val;
            }
            window.g = getM;
            window.f = setM;
        })();
        f(12);
        alert(g()); //12
</script>

 

二. 使用闭包的注意点:

1) 对捕获的变量只引用不是赋值

<script>
        function f(){
            var num = 1;
            function g(){//g scope
                alert(num);
            }
            num++;
            g();
        }
        f(); //f LE
</script>

2) 父函数每调用一次会产生不同的闭包

<script>
        function f(){
            var num = 1;
            return function () {
                num++;
                alert(num)
            }
        }
        var result1 = f(); //LE1
        result1(); //2
        result1(); //3
        var result2 = f(); //LE2,每调用一次会产生一个新的词法环境
        result2(); //2
        result2(); //3
</script>

3) 循环

<body>
    <div id = "1">1</div>
    <div id = "2">2</div>
    <div id = "3">3</div>
    <script>
//        for(var i = 1; i <= 3; i++){
//            var ele = document.getElementById(i);
//            ele.onclick = function () {
//                alert(i); //4 4 4
//            }
//        }
        for(var i = 1; i <= 3; i++){
            var ele = document.getElementById(i);
            ele.onclick = (function (id) {
                return function (){
                    alert(id); //1 2 3
                }
            })(i);
        }

    </script>
</body>

 

转载于:https://www.cnblogs.com/bky-1083/p/7196085.html


http://www.niftyadmin.cn/n/4544273.html

相关文章

java实现排序(6)-快速排序

引言 快速排序&#xff0c;作为一个编程人员来说&#xff0c;肯定都是接触过的。那么&#xff0c;你还记得怎么去实现么&#xff0c;怎么优化呢&#xff1f;在本篇博文中&#xff0c;会详细介绍快速排序的过程&#xff0c;对于不是唯一的过程&#xff08;可变或者可选&#xf…

kerberos配置方法

为什么80%的码农都做不了架构师&#xff1f;>>> 客户端配置 kerberos客户端配置&#xff0c;理论上很简单。安装客户端程序&#xff0c;然后拿到正确的kerberos配置信息&#xff0c;理论上就可以使用kerberos来验证身份了。下面以red hat enterprise server 6.5为例…

java I/O系统(1)-File类

引言 自己对java的IO系统不是非常了解。所以我想进一步一点点去整理好它。在本篇博文中&#xff0c;我们详细介绍一下File类的意义&#xff0c;包括它很大部分的功能。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接&#xff1a;http://blog.csdn.net/u01…

java I/O系统(2)-装饰器模式

引言 IO系统是使用了装饰器模式的典型。所以对装饰器模式的深入研究对IO系统的理解肯定大有裨益。在本文中会详细介绍装饰器模式&#xff0c;会用以demo展示&#xff0c;同时会举出例子在IO系统中是如何呈现了这种模式&#xff0c;最后&#xff0c;我们探讨一下装饰器模式与代…

mysql报错Operand should contain * column解决办法

为什么80%的码农都做不了架构师&#xff1f;>>> 使用了sql语句处理某些内容。当执行某个语句时&#xff0c;Mysql报错误&#xff1a;Operand should contain 1 column 字面意思是&#xff0c;需要有1个数据列。 解决办法&#xff1a;将查询sql的查询结果改为所需的…

java I/O系统(3)-字节流与字符流

引言 在java的IO系统中&#xff0c;对资源的操作分为两类&#xff1a;字节流与字符流。如果延承inputStream与outputStream就是字节流&#xff0c;如果延承reader与writer就是字符流&#xff0c;那么他们之间到底有什么区别呢&#xff1f;在本篇博文中会列出IO系统的所有操作类…

java I/O系统(4)-RandomAccessFile类

引言 RandomAccessFile类是在java.io中的一个工具类&#xff0c;它独立于字符流与字节流之外&#xff0c;自成一派。它的核心功能就是random功能。他可以随机访问到文件的任意位置的资源&#xff0c;对于超大文件的局部修改有很大的帮助。在本篇博文中详细介绍RandomAccessFil…

es7 fetch解决异步嵌套问题

fetch API解决异步嵌套问题 我们昨天学习了async和await&#xff0c;知道他是为了解决浏览器异步获取的的&#xff01;但是我们用fetch api的话方法会更加的简单async和await解决异步嵌套 function ajax(url){return new Promise(function(reslove,reject){let xmlHttpnew XMLH…