Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Costruire oggetto senza eval()

0 views
Skip to first unread message

Max

unread,
Jul 18, 2008, 5:15:07 AM7/18/08
to
C'è un altro modo per scrivere un oggetto prendendo il nome da una
variabile senza l'utilizzo di eval()?
L'eval attualmente è il seguente:

eval(nodeName + '= {' + attributes + '}');

Es:
var nodeName = 'oggetto';

eval(nodeName + '= {' + attributes + '}');

->

oggetto = {...};

Max

ZER0

unread,
Jul 18, 2008, 6:17:48 AM7/18/08
to
On Fri, 18 Jul 2008 11:15:07 +0200, Max wrote:

> 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)

Max

unread,
Jul 18, 2008, 8:10:21 AM7/18/08
to
ZER0 ha scritto:
[CUT]

Cavolo, avevo proprio dimenticato window, oramai in disuso...
Effettivamente sono costretto ad usare eval() per via dello scope. Odio
usare eval() :)

ZER0

unread,
Jul 18, 2008, 8:18:40 AM7/18/08
to
On Fri, 18 Jul 2008 14:10:21 +0200, Max wrote:

> 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.

Max

unread,
Jul 18, 2008, 1:18:01 PM7/18/08
to
ZER0 ha scritto:

> On Fri, 18 Jul 2008 14:10:21 +0200, Max wrote:
>
>> 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. :)

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...

ZER0

unread,
Jul 23, 2008, 4:36:47 AM7/23/08
to
On Fri, 18 Jul 2008 19:18:01 +0200, Max wrote:

>> 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)

0 new messages