Javascript For ...在对象中,始终引用对象中的最后一个键

标签 javascript scope

我有这个代码:

var obj = {"a" : "A", "b" : "B", "c" : "C"};
for( value in obj) {
    setTimeout(function() { 
        console.log(value); 
    }, 100);
}

在控制台中运行该代码的结果是 c 被记录三次。

为什么它总是引用 setTimeout() 中的最后一个键,以及如何让它在 for 循环中按顺序引用它们?

这与范围有关,但我无法理解它......

最佳答案

您需要使用closure .

var obj = {"a" : "A", "b" : "B", "c" : "C"};
for( value in obj) {
    (function(value) {
        setTimeout(function() { 
           console.log(value); 
        }, 100);
    }(value));
}

这是因为在调用 setTimeout 回调函数时,value 的值将会发生变化。

通过将其包装在匿名函数中,value 的值不会改变,因为将为对象中的每个项目创建一个新函数 - JavaScript 具有函数作用域而不是传统的 block 作用域。

关于Javascript For ...在对象中,始终引用对象中的最后一个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722289/

相关文章:

Javascript 嵌套原型(prototype)方法范围

javascript - 本地 Javascript 范围问题

javascript - 遍历所有 div 并在任何 td 中搜索,如果找到下一秒 td 值的获取值

javascript - 如何在 script 标签中使用 AngularJS?

javascript - 我无法在 localStorage 中使用索引

javascript - 使用 AngularJS 的 Flickr 搜索,结果不会让我一直滚动到顶部

javascript - 使用 Angular.js 和 Angular-sanitize.js 时从 json html 数据中剥离 src

Javascript 作用域和递归

java - 解决组件问题 - 范围

javascript - 使用 jQuery 确定 'Revealing Module Pattern' 模块的范围