eval(nodeName + '= {' + attributes + '}');
Es:
var nodeName = 'oggetto';
eval(nodeName + '= {' + attributes + '}');
->
oggetto = {...};
Max
> C'è un altro modo per scrivere un oggetto prendendo il nome da una
> variabile senza l'utilizzo di eval()?
Si, tramite la square bracket notation:
var nodeName = "oggetto";
window[nodeName] = {};
alert(oggetto);
Ovviamente devi parsare a mano tu le proprietà e tutto il resto, se
preferisci non appoggiarti a eval per la ricostruzione dell'oggetto
nel caso di un object initializer in stringa.
Inoltre, non puoi utilizzare questo approccio per variabili che non
siano di tipo globale. Se vuoi avere uno scope locale, devi passare
da un oggetto intermedio e/o usare eval per crearne il riferimento,
ma non necessariamente la costruzione.
Sebbene credo abbia poco senso definire una variabile locale, senza
saperne a priori il nome. :)
--
~ "Ho avuto la fortuna di unire mestiere e passione,
che secondo Stendhal equivale alla felicità."
(Roland Barthes)
Cavolo, avevo proprio dimenticato window, oramai in disuso...
Effettivamente sono costretto ad usare eval() per via dello scope. Odio
usare eval() :)
> Cavolo, avevo proprio dimenticato window, oramai in disuso...
Ma no, non è in disuso, è solo poco conosciuto il metodo: la gente ha
sempre - stranamente - preferito eval(). Vuoi per ignoranza, vuoi per
facilità d'uso.
E quindi poi quando uno si va a vedere il codice altrui per imparare,
finisce che va ad usare eval() sempre e comunque. :)
> Effettivamente sono costretto ad usare eval() per via dello scope.
Ma spiegami il contesto: che senso ha una variabile locale di cui non
sai il nome? Come la usi?
Se mi definisci meglio il contesto, sono sicuro che si può trovare un
modo migliore. Alla peggio, come ti ho detto, usi "eval()" unicamente
per definire la variabile - magari con un controllo di validità.
--
~ Non sono disordinato. Sono solo un massimizzatore di entropia.
Si ricordo infatti che i primi libri che ho studiato su JS,
nell'antichit� ;), usavano parecchio eval()... In realt� solo alcuni
casi erano giusti, ma nello stesso tempo insegnavano a essere "dinamici"
con questo linguaggio...
>> Effettivamente sono costretto ad usare eval() per via dello scope.
>
> Ma spiegami il contesto: che senso ha una variabile locale di cui non
> sai il nome? Come la usi?
> Se mi definisci meglio il contesto, sono sicuro che si pu� trovare un
> modo migliore. Alla peggio, come ti ho detto, usi "eval()" unicamente
> per definire la variabile - magari con un controllo di validit�.
Semplice. Devo convertire in JSON (ad esempio) "element" da un parser
XML. Quindi, creando nel prototipo la funzione ...prototype.toJSON =
function() {...};, mi ritrovo a far uscire l'oggetto prendendone il nome
con this.nodeName con gli attributi (this.attributes.toJSON()) e gli
elementi figli (this.childNodes.toJSON()) e cos� via.
Inoltre usare window non � proprio corretto in quanto progetto potrebbe
andare a "finire" sotto altre implementazioni di Javascript (o gli
stessi engine come Spidermonkey di Mozilla) che non usano window, in
quanto non stanno nell'ambiente di un browser...
>> Ma spiegami il contesto: che senso ha una variabile locale di cui non
>> sai il nome? Come la usi?
>> Se mi definisci meglio il contesto, sono sicuro che si può trovare un
>> modo migliore. Alla peggio, come ti ho detto, usi "eval()" unicamente
>> per definire la variabile - magari con un controllo di validità.
> Semplice. Devo convertire in JSON (ad esempio) "element" da un parser
> XML. Quindi, creando nel prototipo la funzione ...prototype.toJSON
Se lo fai cross-browser, è un conto. Ma se lo fai solo per Gecko, ad
esempio, potresti usare direttamente E4X.
> function() {...};, mi ritrovo a far uscire l'oggetto prendendone il nome
> con this.nodeName con gli attributi (this.attributes.toJSON()) e gli
> elementi figli (this.childNodes.toJSON()) e così via.
Chiarissimo. Non è chiaro allora a cosa ti serva l'eval, non ne vedo
il senso d'essere. Ti basta la square bracket notation, e puoi anche
fare a meno del window, dato che sei già in un oggetto.
--
~ Non esiste la certezza: è solo l'illusione di una realtà soggettiva.
(Fabio Mornati)