2016-10-13 17 views
0

のsetTimeout問題でJSONオブジェクトを更新

var state = { 
 
    item1 : { 
 
    text : "hi hi" 
 
    } 
 
} 
 

 
var i = 5; 
 

 
function test() { 
 
    state.item1.text = i; 
 
    console.log(state) 
 
    i-- 
 
    if (i >= 0) { 
 
    setTimeout(test, 1000); 
 
    } 
 
} 
 

 
test();

このJSONオブジェクトを更新するとき、それは正しい値が表示されない非常に奇妙な問題があります。どんな助けでも大歓迎です。ログconsole.log(state.item1)をコンソールに接続すると、正しい値が出力されます。しかし、console.log(state)は不正確な値を示します。

Codepen例 http://codepen.io/chrisburgin95/pen/xEzvWz

+0

あなたはどう思いますが、「正しい値」であり、あなたは何を見ていますか? Codepenの出力は私にとって正しいと思われます。 – smarx

答えて

2

console.log()は、オブジェクトのコピーを保存しません。代わりに、ネストされたプロパティを展開すると、現在のの各プロパティの値が読み込まれます。

コードで同じオブジェクトが変更されるため、すべてのタイムアウトが発生した後にログに記録されたオブジェクトを展開すると、最終値が表示されます。

2

JavaScriptのオブジェクトは参照渡しです。アイテムがコンソールに印刷されると、オブジェクトは、印刷された状態ではなく、現在の状態になります。コンソールでオブジェクトを展開する場合は、記録された項目ごとにstate.item1のテキスト値が0であることがわかります。

この答えは、このテーマに関するいくつかの良い会話を持っていますJavascript by reference vs. by value