因为循环奇怪的行为

时间:2016-07-15 22:30:42

标签: javascript for-in-loop lexical-scope

我有一个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

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

1 个答案:

答案 0 :(得分:3)

您需要在两个函数中使用key声明var。目前,它是一个隐含的全局变量。

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

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

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