将函数添加到javascript';循环中的数组

将函数添加到javascript';循环中的数组,javascript,Javascript,我试图创建一个循环中包含函数的数组。但是我认为没有关于封装的东西 例如,此代码返回“y” HTML <div id="result"></div> Javascript var json = { '1':'x', '2':'y' }; var my_array = []; var div = document.getElementById('result'); for (var key in j

我试图创建一个循环中包含函数的数组。但是我认为没有关于封装的东西

例如,此代码返回“y”

HTML

<div id="result"></div>

Javascript

var json = {
            '1':'x',
            '2':'y'
           };
var my_array = [];
var div = document.getElementById('result');

for (var key in json) {
    my_array.push(function() { 
        div.innerHTML = div.innerHTML + ' ' + json[key];
    });
};

var length = my_array.length;

for (var i = 0; i < length; i++) {
  my_function = my_array[i];
  my_function();
}
var json={
“1”:“x”,
“2”:“y”
};
var my_数组=[];
var div=document.getElementById('result');
for(json中的var键){
my_array.push(函数(){
div.innerHTML=div.innerHTML+''+json[key];
});
};
var length=my_array.length;
对于(变量i=0;i
我该怎么做才能得到“x y”


Tnx很多。

这是由于JavaScript中闭包的工作方式

你想要这样的东西:

for (var key in json) {
    (function(key) {
        my_array.push(function() { 
            div.innerHTML = div.innerHTML + ' ' + json[key];
        });
    })(key);
}
在JavaScript中,闭包或匿名函数在词汇上绑定到定义它们的范围。这意味着,它们可以访问在定义闭包的范围内定义的所有变量

因此,在原始代码中,您有
,它最初指向
1
。函数中有
json[key]
,它原来是
json[1]
,它是
x
。然后,当循环转到下一次迭代时,您将
键设置为
2
。但问题是第一个函数实例和第二个函数实例中的
键都指向同一位置。因此,当您最终计算函数时,它们将使用执行时
key
所具有的任何值。执行时,
key
设置为
2
,因为这是循环结束时
key
的最后一个值

要解决这个问题,您必须使用一个匿名的、自调用的函数来引入一个新的作用域。通过使用此模式,您故意引入了一个新范围,使得此新范围中的
key
具有自己的位置,并且与外部范围中的
key
不同


.

另一个被Closure咬伤的案例它不起作用,因为在你调用函数时,关键变量的值是'2'@KamenStoykov,哦,我知道它为什么不起作用:)这里有点好奇。为什么需要一系列函数?有一个键数组或任何需要使用的值不是更简单吗?@Frederik.L我正在用ajax请求生成瀑布这不起作用。。。即使您可以识别问题,您也可能希望在将代码作为问题提交之前验证代码是否正常工作answer@taylorc93轻微打字错误;修复。您不必“通过使用匿名、自调用函数引入新的作用域”。您可以通过调用传递必要内容并返回新函数/作用域的函数以更简洁的方式完成此任务。@Ian这是另一种同样有效的方法。我想这是个人偏好的问题,但我发现以这种方式使用匿名函数比调用另一个函数更为惯用。然后,您必须跳转到该函数,该函数可能会有点不一致,并导致一些上下文丢失。再说一次,这只是个人喜好的问题。@VivinPaliath thx很多。很好。特别感谢您的评论