我有这个代码:
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/