zoukankan      html  css  js  c++  java
  • js闭包

    先展示两段代码块看看到底有什么区别

    function foo(x) {
        var tmp = 3;
        return function (y) {
            alert(x + y + (++tmp));
        }
    }
    foo(2)(10);
    function foo(x) {
        var tmp = 3;
        function bar(y) {
            alert(x + y + (++tmp));
        }
        bar(10);
    }
    foo(2)

    这两段代码都是alert(16),区别到底在哪。

    代码块①出现了闭包。

    准确来说 这块就是一个闭包。

    闭包是基于正常的垃圾回收处理机制下的。也就是说,一般情况一个函数(函数作用域)执行完毕,

    里面声明的变量会全部释放,被垃圾回收器回收。但闭包利用一个技巧,让作用域里面的变量,

    在函数执行完之后依旧保存没有被垃圾回收处理掉。

     

     

    或者说一下我现在的一个需求

    我需要在for循环里面进行事件的绑定,这个应该怎么操作?

    第一反应是这样(原生js)

    <script>
    window.onload=function(){
        var list = ['a','b'];
        for(var i in list){
            document.getElementById(list[i]).onclick=function(){
                alert(list[i]);
            }
        }
    }
    </script>
    </head>
    <body>
        <div id="a">aaa</div>
        <div id="b">bbb</div>
    </body>

    可以尝试一下,绝对都是alert(b)

    原因就是执行完之后变量i被回收了。

    可以换另一中方式

    <script>
    window.onload=function(){
        var list = ['a','b'];
        for(var i in list){
            (function(j){
                document.getElementById(list[j]).onclick=function(){
                    alert(list[j]);
                }
            })(i)
        }
    }
    </script>
    </head>
    <body>
        <div id="a">aaa</div>
        <div id="b">bbb</div>
    </body>

    使用闭包来解决。nice!!!

    我的low逼见解,前端了解就是。

  • 相关阅读:
    第十八章 Nginx Rewrite重写
    第二十章 HTTPS实现LNMP全站访问
    第十九章 HTTPS协议介绍
    第二十一章 Nginx常用HTTPS配置
    第二十三章 Nginx常见问题思考
    ABC232
    1606E Arena
    st+dfs序求lca
    Servlet——HTTP状态 405 方法不允许
    借助SimpleDateFormat来谈谈java里的多线程不安全
  • 原文地址:https://www.cnblogs.com/chywx/p/9631686.html
Copyright © 2011-2022 走看看