2011-07-30 70 views
-2

可能重复的时间返回值说明:
How do JavaScript closures work?为什么这个封闭在迭代

据我所知,至少1个以上的人有倒闭的是,它返回的最新的给定变量的值,除非你这样做:

function f() { 
    var a = []; 
    var i; 

    for (i = 0; i < 3; i++) { 
     a[i] = (function (x) { 
      return function() { 
       return x; 
      } 
     })(i); 
    } 
    return a; 
} 
} 

有一点点很多事情我都需要解释。

+2

请具体说明您的问题。你现在应该已经知道了。 – hugomg

+2

看起来你加了一个'}'太多了。 – pimvdb

+0

看看这个问题,了解如何在JavaScript中关闭工作的一个很好的解释http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

回答

1

在JavaScript中,变量的作用域始终是function(或全局对象)。所以,如果你做类似

for (var i = 0; i < 3; i++) { 
    a[i] = function (x) { 
     return i; 
    }; 
} 

只有一个i参与。在for循环完成后,i的值是2,无论调用哪个函数a[i]

要解决这个问题,我们需要建立一个新的范围。通常,这是通过调用像这样的匿名函数来完成:

a[i] = (function (x) { // (1) 
    return function() { // (2) 
     return x; 
    }; 
})(i); 

现在i在迭代时间被映射到新x一个品牌的每一次迭代,函数(1)确保它被“困”,直到执行a[i](2)。