2010-09-15 5 views
3

J'ai une variable JSON globale où je stocke des paramètres et chaque fois que je lance la fonction, je veux pouvoir les modifier mais seulement localement à l'intérieur de cette fonction.Pourquoi la fonction renvoie-t-elle la valeur de la variable JSON locale au lieu de la variable globale?

Donc, chaque fois que je lance la fonction, je veux une nouvelle copie de la variable globale à l'intérieur de la variable locale. Le problème est que je copie la variable globale à une variable locale définie dans la fonction, et que j'apporte des changements à la variable locale, mais la prochaine fois que j'exécuterai la fonction, en ayant une copie intacte de la variable globale, Je suis celui où j'ai déjà modifié les choses.

Merci! :)

var test = {"name":"me"}; 
function bla() { 
    var t=test; 
    t.name="you"; 
    t.age=55; 
    alert(test.name); // Returns "you" that have been set locally instead of "me" that was global value. 
} 
bla(); 

Répondre

2

objets sont attribués par référence donc après

var t=test; 

les variables t et test se réfèrent au même objet. Vous devez faire une copie de l'objet pour obtenir le comportement que vous recherchez. Puisque vous travaillez avec JSON, vous pouvez simplement sérialiser l'objet original, puis réanalysera dans une nouvelle variable

var t = JSON.parse(JSON.stringify(test)); 

modifier le nouvel objet comme bon vous

+1

En passant par JSON pour cloner un objet, tous les membres non sérialisables (comme les fonctions) seront éliminés. –

+0

Lisez "Puisque vous travaillez avec JSON", puis lisez le titre et le corps de cette question. Tant que l'objet est destiné à JSON, la sérialisation et la désérialisation du clonage sont probablement plus rapides et moins sujettes aux erreurs que l'écriture d'une fonction récursive personnalisée. – MooGoo

2

var t = test ne crée pas une copie du objet. Il fait simplement référence au même objet avec un autre nom. Si vous souhaitez copier l'objet, envisagez d'utiliser quelque chose comme fonction $.extend() jQuery:

var t = $.extend({}, test); 

Alors que sur ce sujet, le code équivalent pour tableaux est la suivante:

var t = test.slice(0); 
2

sur votre ligne

var t=test; 

vous n'êtes pas copie le contenu de test, vous créez une nouvelle référence au même contenu. par conséquent, toute modification du contenu de t modifie également le test.

1

Pour copier un objet arbitraire à une autre variable, utiliser une fonction prototype comme celui-ci:

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

Utilisation:

var bar = foo.clone(); 

http://my.opera.com/GreyWyvern/blog/show.dml/1725165

Questions connexes