2016-07-15 22 views
0

for-inループで奇妙な動作があります。forループの奇妙な振る舞い

コード:私は、出力はこのようなSTHである必要があり、予想通り

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); 
    } 
}(); 

qqwweerr

しかし、私はこの得た:

qcwcecrcを

I thを見つけることができませんこの動作の背後にある論理! キー変数は語彙的にスコープされています。 私のコードで何が問題になっていますか?

+1

'let'または'あなたがそれらをしたいレベルでの任意の識別子をvar'することを忘れないでください –

答えて

3

両方の機能でkeyvarと宣言する必要があります。現在、それは暗黙のグローバル変数です。

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

それはグローバルなので、両方の機能でkeyへの参照は、同じ変数なので、test()台無しアップ匿名関数内のループ内のループを伴います。

(あなたがしたい場合は、この場合には、それは違いはありませんでしょうけれどもあなたは、let代わりのvarを使用することができます。)