for in 循环奇怪的行为

for in loop weird behavior

我在 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 r

但我明白了:

q c w c e c r c

我找不到这种行为背后的逻辑! 关键变量是词法范围的! 我的代码有什么问题?

您需要在两个函数中声明 keyvar。目前,它是一个隐式全局变量。

function test(data){
    for (var key in data){
        //do sth;
    }
}

因为它是全局的,所以在两个函数中对 key 的引用涉及相同的变量,所以 test() 中的循环弄乱了匿名函数中的循环。

(如果您愿意,您可以使用 let 而不是 var,但在这种情况下没有任何区别。)