将函数添加到javascript';循环中的数组
我试图创建一个循环中包含函数的数组。但是我认为没有关于封装的东西 例如,此代码返回“y” HTML将函数添加到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
<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很多。很好。特别感谢您的评论