javascript - 在循环中将函数添加到javascript的数组

标签 javascript

我尝试用循环中的函数创建数组。但我认为不要了解封装。

例如,此代码返回“y y”。 Live demo .

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();
}

我应该怎么做才能得到“x y”?

非常感谢。

最佳答案

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

你想要这样的东西:

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

在 JavaScript 中,闭包或匿名函数在词法上绑定(bind)到它们定义的范围。这意味着它们可以访问在闭包定义的范围内定义的所有变量。

因此在您的原始代码中,您有 key , 最初指向 1 .在你的函数中,你有 json[key] , 原来是 json[1] ,即 x .然后当循环进入下一次迭代时,你有 key设置为 2 .但问题是 key在第一个函数实例和第二个函数实例中都指向相同的位置。因此,当您最终评估该函数时,它们将使用任何值 key 在执行时。执行时,key设置为 2因为那是 key 的最后一个值在循环结束时。

要解决此问题,您必须使用匿名的自调用函数引入新范围。通过使用此模式,您有意引入了一个 范围,这样 key在这个新范围内有自己的位置,不同于 key在外部范围内。

Check out the updated fiddle .

关于javascript - 在循环中将函数添加到javascript的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17603267/

相关文章:

http-equiv 上的 Javascript Hook ="refresh"

javascript - Ajax 成功 : {return false;}

javascript - html文件上传后如何加载到iframe中?

javascript - 输入检查使用JS更改主体背景颜色

java - 如何将复选框的多个值以param=value1%2Cvalue2格式发送到后端?

javascript - 尝试使用 Tablesorter 完全动态地构建表格

javascript - 如何在 Pug 中定义内联变量

javascript - 按升序对本地存储分数进行排序

Javascript 打开一个禁用地址栏的新浏览器窗口(不是选项卡)

预编译为纯 JavaScript 的 JavaScript 模板语言