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

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

在调用时才算真正调用

原文地址:https://www.cnblogs.com/lin3615/p/3646941.html