Javascript 用于循环中的奇怪行为

Javascript 用于循环中的奇怪行为,javascript,for-in-loop,lexical-scope,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}); co

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

但我明白了:

q c w c e c r c

我找不到这种行为背后的逻辑! 关键变量的作用域是词汇性的!
我的代码出了什么问题?

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

function test(data){
    for (var key in data){
        //do sth;
    }
}
由于它是全局的,两个函数中对
键的引用都涉及相同的变量,因此
test()
中的循环会弄乱匿名函数中的循环


(如果愿意,您可以使用
let
而不是
var
,尽管在本例中没有区别。)

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

function test(data){
    for (var key in data){
        //do sth;
    }
}
由于它是全局的,两个函数中对
键的引用都涉及相同的变量,因此
test()
中的循环会弄乱匿名函数中的循环


(如果您愿意,您可以使用
let
而不是
var
,尽管在本例中没有区别。)

记住
let
var
您想要的级别上的任何标识符记住
let
var
您想要的级别上的任何标识符