• 闭包示例不宜多用,耗内存资源


    这样函数会返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,即位置为0的函数返回0,位置为1的返回1,以此类推。但实际上,每个函数都返回10。因为每个函数的作用域链中都保存着 cFunc()函数的活动对象,所以它们引用的都是同一个变量i,当cFunc() 函数返回后,变量 i 的值为 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以在每个函数内部 i 的值都是 10

        function cFunc()
        {
            var result = new Array();

            for(var i=0; i<10; i++)
            {
                result[i] = function(){
                        return i;
                    };
            }
            return result;

        }

        var funcs = cFunc();
            for(var i=0; i<10; i++)
        {
            document.write(funcs[i]() + "<br />");
        }
        //结果为
        /*
    10
    10
    10
    10
    10
    10
    10
    10
    10
    10
        */

    =======================================
        /*
        for(var i=0; i<10; i++)
        {
            document.write(funcs[i] + "<br />");
        }
    结果为:
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }
    function (){ return i; }

        */
    ==================
    可以通过创建另一个匿名函数强制让闭包的行为符合预期:
        function cFunc()
        {
            var result = new Array();

            for(var i=0; i<10; i++)
            {
                result[i] = function(num){
                        return function()
                        {
                            return num;
                        }
                    }(i);
            }
            return result;
        }

        var funcs = cFunc();
        for(var i=0; i<10; i++)
        {
            document.write(funcs[i]()+"<br />");
        }
        // 结果为
        /*
        0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    */

    没有直接把闭包赋值给数组,而是定义了一个匿名函数,并将立即执行该匿名函数的结果赋给数组。这里的匿名函数有一个参数 num, 也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入了变量 i,由于函数参数是按值传递的,所以就会将变量 i 的当前值复制给参数 num.而在这个匿名函数内部,又创建并返回一个访问 num 的闭包。这样一来,result 数组中的每个函数都有自己 num 变量的一个副本,因此就可以返回各自不同的数组了。
    =======================

        var nn = (function(){
            alert("lin3615");
        })();

    以上会立即调用

    =====================

        var nn = (function(){
            alert("lin3615");
        });
        nn();

    在调用时才算真正调用

  • 相关阅读:
    Hadoop Gateway 部署
    java 命令--备忘
    整理下常用硬件性能参数
    python 脚本备份 mysql 数据库到 OSS
    pip 更换国内源
    记录闭包和立即执行函数
    Django 中文乱码问题&富文本显示
    mysql exceeded the 'max_questions' resource 记录
    sql server 数据字典的妙用
    Sublime Text指南
  • 原文地址:https://www.cnblogs.com/lin3615/p/3646941.html
Copyright © 2020-2023  润新知