zoukankan      html  css  js  c++  java
  • 闭包示例不宜多用,耗内存资源

    这样函数会返回一个数组。表面上看,似乎每个函数都应该返回自己的索引值,即位置为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();

    在调用时才算真正调用

  • 相关阅读:
    [moblie]safari 关闭上下文菜单和选区菜单
    [javascript] <完全开源,开心分享> HTML5 Canvas 在线图片处理《imageMagic》(single page app)开发详解[1]
    [nodejs]q&a
    [tool]webstorm 用firewatcher编译less
    前端截长屏功能
    切换路由默认回到顶部功能
    echarts 词云图和Map图兼容
    针对笔记本电脑系统默认缩放为150%导致页面放大解决方案
    关于专利的写作注意的要点(待续)
    Quartus中引脚的添加
  • 原文地址:https://www.cnblogs.com/lin3615/p/3646941.html
Copyright © 2011-2022 走看看