2012-08-13 3 views
0

Prenons l'exemple suivant:jQuery différés et console.log - Comportement étrange

var $_dfd = $.Deferred(), 
    $_x = {}; 

$_x = { 
    a: 1, 
    b: 2 
}; 

console.log($_x); // Gives {a: 1, b: 2, more: {c: 3, d: 4}} <== Weirdness here 
console.log($_x.a); // Gives 1 
console.log($_x.more); // Gives undefined 

$_dfd.pipe(function($_x) { 
    $_x.more = { 
     c: 3, 
     d: 4      
    }; 

    return $_x; 
}); 

$_dfd.resolve($_x).done(function($_x) { 
    console.log($_x); // Gives {a: 1, b: 2, more: {c: 3, d: 4}} 
}); 

Je suis vraiment totalement déconcerté par console.log sortie # 1. Il y a deux questions qui doivent répondre:

  1. Quel est l'état réel de la $_x variable à la première sortie CONSOLE.LOG?

  2. Si console.log n'est pas un moyen sûr de comprendre l'état des variables lorsque vous travaillez avec différé, quelles sont les autres meilleures alternatives?

Merci!

+0

ne suis pas sûr de la question différée, mais notez qu'il n'y a pas de point initialisant '_x' $ à un objet vide lorsque vous jeter immédiatement que loin et l'assigner égal à un second objet. – nnnnnn

+0

P.S. Je me suis souvenu que j'avais déjà vu quelque chose à propos de 'console.log()' se comportant comme ceci: http://stackoverflow.com/q/11118758/615754 - une solution consiste à cloner l'objet avant de le consigner: 'console.log (JSON.parse (JSON.stringify ($ _ x))); ' – nnnnnn

+0

@nnnnnn a raison, si vous déboguez et passez dessus - il produit la sortie correcte. En utilisant l'astuce clone fonctionne aussi bien http://jsfiddle.net/2tfTr/ –

Répondre