2009-10-02 9 views
0

Je voudrais déclarer certaines variables, puis laissons une fonction construire les objets réels et assigner leur référence à ces variables précédemment déclarées.Javascript - Définir la valeur variable à l'intérieur de la fonction

La façon dont je le fais fonctionne maintenant, mais cela devient fastidieux avec beaucoup de variables.

function bar(obj) { 
    var newObject = {'an':'object'}; 
    obj['element'] = newObject; 
} 

function foo() { 
    var ref={}; 
    bar(ref); 
    ref=ref.element; // Tedious line 
} 

Pour ceux qui se demandent pourquoi je voudrais faire une telle chose, je construit une fonction simple pour générer le DOM de JSON. Il va quelque chose comme ça, avec #bind utilisé pour faire ce que bar fait dans l'extrait précédent:

var legend = {}; 
$('#element').append(['form',['fieldset', 
    ['legend',{'#bind':legend},['text':'Legend title']] 
    ]].getDomForThis()); 
legend=legend.element; 

Maintenant, je peux ajouter quelques nouveaux éléments après la légende avec quelque chose comme

for(fieldName in fields) { 
    legend.insertAfter(['div',[['input',['name':fieldName]],...]].getDomForThis()); 
} 

Je voudrais pour éviter d'avoir à écrire la ligne fastidieuse. C'est comme createElement et appendChild, un appel de fonction devrait suffire!

MISE À JOUR: Après réflexion, je crois qu'il n'y a aucun moyen de le faire avec Javascript. J'espérais quelque part de la magie Javascript cachée, mais j'ai des raisons de penser que ça n'arrivera pas.

Fondamentalement, je voudrais attribuer à une référence de variable une nouvelle valeur, sans créer une nouvelle référence. Mais un argument de fonction a est distinct de la variable v qu'il représente. Les objets pointés sont les mêmes, mais l'adresse des deux variables est différente. Par conséquent, l'attribution d'une nouvelle valeur à a ne peut en aucun cas modifier la valeur de v. En d'autres termes, chaque variable a sa propre adresse, et il n'y a pas d'autre moyen de changer ce qu'elle pointe, que de la référencer explicitement.

Et dans mon cas, parce que ref est "privé" à la fonction, il n'y a aucun moyen d'y accéder depuis un autre endroit.

Dommage ...

+0

Ai-je tort ou "ref = ref.element;" dans votre 1er exemple devrait lire "ref = obj.element;" ? – MaxiWheat

+1

Et ne devrait pas barre (obj) dans ce même lieu être barre (ref)? – epascarello

+0

à droite, j'ai hésité entre les deux. Fixé. – Gzorg

Répondre

1

Comme il n'y a pas BYREF en JavaScript, votre code et les suivantes sont les mêmes

function bar(obj) { 
    return {'an':'object'}; 
} 

function foo() { 
    var obj = {}; 
    obj.element = bar(); 
} 

Cependant, vous pouvez faire quelque chose de similaire à ceci:

function Foo() {   
    this.that = this, 
    this.obj = {}; 
    this.bar = function() { 
     var newObject = {'an':'object'}; 
     that.obj['element'] = newObject; 
    } 

    return this; 
} 

var f = Foo(); 

f.obj['foo'] = 'BAR'; 
f.bar(); 
console.log(f.obj.element.an); 
+0

Merci d'avoir répondu, mais je ne comprends pas. Dans mon exemple, obj finit par être égal à {'an': 'object'}, alors que dans le vôtre, obj, à la fin de foo, est égal à {'element': {'an': 'object'}} , qui n'est donc pas équivalent. – Gzorg

Questions connexes