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逼见解,前端了解就是。

  • 相关阅读:
    Django MVC与MTV概念 Ajax、分页实现
    Django F查询Q查询Only与Defel
    Django ORM 操作
    已有数据的表添加自增主键
    java随机字符串+校验位
    mysql日志触发器
    dad
    jsp自定义标签
    php-pfm指定配置文件
    type
  • 原文地址:https://www.cnblogs.com/chywx/p/9631686.html
Copyright © 2011-2022 走看看