代码段1function f(x) 
{  
    var g = function () { return x; }  
    return g;  
}var g1 = f(1);  
var g2 = f(2);  
alert(g1());  //输出 1  
alert(g2());  //输出 2
代码段2function a()
{
var array = new Array();
for (var i = 0; i < 10; i++)
{
array.push(function() {return i});
}

return array;
}var array = a();
for (var i = 0; i < array.length; i++)
{
window.alert(array[i]()); //全是10
}
同样都是闭包,为什么第1段代码输出的值不同,而第二段相同呢?

解决方案 »

  1.   

    <script>
        function a()
    {
    var array = new Array();
    for (var i = 0; i < 10; i++)
    {(function(i){
    array.push(function() {return i});
    })(i)}

    return array;
    }

    var array = a();
    for (var i = 0; i < array.length; i++)
    {
    window.alert(array[i]()); //全是10
    }
    </script>代码2应该这么写~·才会形成闭包~·
      

  2.   

    1楼是对的
    楼主
    for (var i = 0; i < 10; i++)
        {
            array.push(function() {return i});
        }这样做。function() {return i}的时候i是在a的变量作用域中
      

  3.   


    array.length  打出来看看不就知道是什么原因了吗
      

  4.   

    这是闭包么?这只是你前边定义一个函数 在后边去调用的他啊把你这代码打上断点 调试跟踪一下你就能看到 了 是从 var array = a(); 执行时 才会去调你写的方法把下边的循环 换个变量 j 你就能看出 其实你这个Array里放的 都 是 function(){return i} 这个i 在前边那个循环结束后  就是10了 第二个循环 你再调 用时 返回的i 不就是10么
      

  5.   


    对不起 是我不细心 1楼是对的 我看错行了 Sorry
      

  6.   

    array.push(function() {return i}); 此时 i 并没有固定到 匿名函数中,等到匿名函数运行时还是用的scope a中的i
      

  7.   

    还有,为什么代码1中输出结果不一样呢? g1和g2中的闭包包含的都是f的作用域啊?
      

  8.   

    代码1的x是通过传参进来的,是随着所传的参数而变化的;代码2的a()里面的i和array是在同一个作用域,其实你在返回array的时候数组元素里面i的值都是一样,那么返回数组时最后变成什么值就都是什么值
      

  9.   

    函数链保存着呢,返回i的结果,这个i和后面的函数i的地址是同一个,后来改变了,自然变化了function a()
    {
        var array = new Array();
        for (var i = 0; i < 10; i++)
        {
            var j=i;
            array.push(function() {return j});
        }
        
        return array;
    }var array = a();
    for (var i = 0; i < array.length; i++)
    {
        window.alert(array[i]()); 
    }
      

  10.   

    没错,你的两个都有闭包。
    为什么不一样,
    第二个里面,你在a里定义了10 个function,注意这个10 个function 都是在a执行时,一定定义完成的。function 在定义的解析的时候,会有一个[[scope]]属性指向它定义时所在的环境,这10个function 都指向了这一个a执行时的环境,而i就是在这个环境中的一个变量。随着执行的完成,i最后变成了10。当你在外面再通过数组项的function 引用去调这些function 时,这些function 对这个i的解析是同一个,所以会是10。而第一个,你是通过两次执行同一个function,返回两个function 的引用。function 每次执行都没生成不一样的运行环境,返回的这两个function 的[[scope]]的指向也是不一样的,分别两个不同的变量,只是表面名字一样,所以结果也不一样了。
      

  11.   

    修正:...10个function 都是在a一次执行中定义完成的。