我有一个for-in循环的奇怪行为。
代码:
var obj = {
q:1,
w:2,
e:4,
r:5
};
function test(data) {
for (key in data) {
//do sth;
}
}
!function() {
for (key in obj) {
console.log(key);
test({a:1,b:2,c:3});
console.log(key);
}
}();
正如我所料,输出应该是这样的:
q q w w e e r r
但我得到了这个:
q c w c e c r c
我无法找到这种行为背后的逻辑! 关键变量是词法范围的! 什么是我的代码?
答案 0 :(得分:3)
您需要在两个函数中使用key
声明var
。目前,它是一个隐含的全局变量。
function test(data){
for (var key in data){
//do sth;
}
}
因为它是全局的,所以两个函数中对key
的引用都涉及相同的变量,因此test()
中的循环会扰乱匿名函数中的循环。
(如果您愿意,可以使用let
代替var
,但在这种情况下,它不会有任何区别。)