OVH Cloud OVH Cloud

[javascript] Nom de variable dynamique

13 réponses
Avatar
jero
bonjour,

je cherche =E0 cr=E9er des variables dont le nom serait dynamique.
Cela se fait tr=E8s facilement en actionscript avec eval(), assez
facilement en PHP puisque dans les deux cas je trouve beaucoup de
propositions dans les r=E9sultats de mes recherches.

En revanche rien pour le javascript ...

quelqu'un as-t-il une id=E9e ou une solution (!) =E0 partager sur le
sujet.

D'avance merci.
J=E9r=F4me

10 réponses

1 2
Avatar
ASM
bonjour,

je cherche à créer des variables dont le nom serait dynamique.
Cela se fait très facilement en actionscript avec eval(),


ça existe aussi en JS,

exemple simple :

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'



--
Stephane Moriaux et son [moins] vieux Mac

Avatar
jero

je cherche à créer des variables dont le nom serait dynamique.
Cela se fait très facilement en actionscript avec eval(),


ça existe aussi en JS,

exemple simple :

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'

tout a fait exact et merci !

mais si je cherche à écrire le nom de la variable de façon dynamique
?

exemple que j'essaie de faire simple :

var truc = uneValeur
var [laValeurDeTrucCommeNomDeVariable] = 'muche'

// mais si ca se trouve je me fourvoie totalement à vouloir faire cela
...
// en tous les cas merci d'avance


Avatar
Laurent vilday
je cherche à créer des variables dont le nom serait dynamique.



Humm, ca dépend ce que tu appelles "dynamique". S'agit-il de variables
globales, locales, de références à des éléments HTML, ... ?

exemple simple :

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


Oui ou encore sans le eval() ce serait mieux :)
eval() a la facheuse habitude de perdre le scope (contexte) d'execution
( cad que la variable magique *this* au sein de la chaine évaluée perd
sa signification et deviens l'objet window). eval() n'est à ma
connaissance que dans de très rares cas nécessaire.

var truc = 'machin';
var machin = 'muche';

alert(window[truc]); // donne aussi 'muche'

--
laurent


Avatar
jero
finalement je me fourvoyais effectivement

j'ai simplement crée un tableau au niveau global
que je récupére dans mes fonctions justement grace à
window.monTableau et que j'indice avec l'identifiant qui me conviens.
c'est beaucoup plus simple que mon idée initiale de vouloir absolument
créer dynamiquement le nom de mes variables.

merci en tous les cas.
jérôme
// plus vieux que son PC pourtant plus tout jeune non-plus :)
Avatar
ASM

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


Oui ou encore sans le eval() ce serait mieux :)


Désolé mais ... non.

Sinon à quoi pourrait bien servir eval() si ce n'est pour évaluer ?

alert(truc);

me donne : 'machin'
comme de juste, puisque 'machin' est bien la valeur de truc.

--
Stephane Moriaux et son [moins] vieux Mac


Avatar
Florian Sinatra
*ASM* @ 27/08/2006 17:06 :
bonjour,

je cherche à créer des variables dont le nom serait dynamique.
Cela se fait très facilement en actionscript avec eval(),


ça existe aussi en JS,

exemple simple :

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


En effet.. mais pourquoi eval(truc) ne retourne-t-il pas la chaîne
'machin' ? S'il la retourne (comme typeof(eval(truc)) me le fait
penser), pourquoi ca n'est pas équivalent à alert('machin') ?


Avatar
Laurent vilday

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


Oui ou encore sans le eval() ce serait mieux :)


Désolé mais ... non.


Désolé mais ... si. Relis bien ma réponse, tu y trouveras ceci.

var truc = 'machin';
var machin = 'muche';
alert( window [ truc ] );

Sinon à quoi pourrait bien servir eval() si ce n'est pour évaluer ?


Honnêtement, ce serait que moi, je ferais dégager le eval(), ca ne sert
presque à rien ( mise à part, ok, parser un string JSON, et encore il
existe des librairies pour lire ces strings http://www.json.org/json.js
) ou alors j'ai pas encore trouvé le réel intérêt de la chose. Avec un
eval, tout ce qu'on risque, c'est de perdre les contextes et de
manipuler les mauvaises variables.

alert(truc);

me donne : 'machin'
comme de juste, puisque 'machin' est bien la valeur de truc.


Oui of course, mais ce n'est pas ce que j'avais écrit. Evidemment que
alert(truc) donne 'machin', mais alert( window [ truc ] ), donne bien
'muche' comme désiré.

Du code avec eval est plus difficile à maintenir que sans.
Du code avec eval est plus difficile à debugger que sans.
Du code avec eval est plus lent que sans.
Du code avec eval est plus gourmand en mémoire que sans.
Du code avec eval est potentiellement plus vulnérable que sans.

http://userjs.org/help/tutorials/efficient-code#evalevil
<quote lang="en">
The 'eval' method, and related constructs such as 'new Function', are
extremely wasteful. They effectively require the browser to create an
entirely new scripting environment (just like creating a new web page),
import all variables from the current scope, execute the script, collect
the garbage, and export the variables back into the original
environment. Additionally, the code cannot be cached for optimisation
purposes. eval and its relatives should be avoided if at all possible.
</quote>

http://www.jslint.com/lint.html
<quote lang="en">
The eval function (and its relatives, Function, setTimeout, and
setInterval) provide access to the JavaScript compiler. This is
sometimes useful for parsing JSON text, but in virtually all other cases
it indicates the presences of extremely bad coding. The eval function is
the most misused feature of javaScript.
</quote>

http://blogs.msdn.com/ericlippert/archive/2003/11/01/53329.aspx
<quote lang="en">
There is absolutely no reason to use eval to solve problems like mapping
strings or numbers onto objects. Doing so dramatically lowers the
quality of the code on pretty much every imaginable axis.
</quote>

http://jibbering.com/faq/#FAQ4_40
http://kevinhenrikson.com/2006/02/09/eval-is-evil-window-to-the-rescue/
http://groups.google.fr/groups?q=eval%20is%20evil%20javascript&hl=fr&lr=&sa=N&tab=wg

--
laurent



Avatar
Laurent vilday
*ASM* @ 27/08/2006 17:06 :
var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


En effet.. mais pourquoi eval(truc) ne retourne-t-il pas la chaîne
'machin' ?


Si le contenu est une expression - c'est le cas ici - , alors cette
expression est evaluée (dans le sens interprétée).

http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Functions:eval

Un "équivalent" de l'interprétation du alert(eval(truc)) peut se
traduire comme suit (attention les yeux :)

var FUNC = new Function("return " + truc);
alert( FUNC() );

Ce qui, une fois interprété, devient :

var FUNC = new Function("return machin");
alert( FUNC() );

Puisqu'on retourne le contenu de la variable "machin", ca devient bien :

var FUNC = new Function("return 'muche'");
alert( FUNC() );

Et pour finir c'est donc effectivement un string qu'y est retourné pour
finir sur le string "muche" :

alert('muche');

Il n'en reste pas moins que le eval est a proscrire quand il existe
(presque toujours) une solution plus efficace.

Dans l'exemple ici : alert( window [ truc ] );

S'il la retourne (comme typeof(eval(truc)) me le fait
penser), pourquoi ca n'est pas équivalent à alert('machin') ?


parce que alert('machin') ne permet aucune interprétation du contenu,
'machin' reste un string ad vitam eternam. Contrairement à *machin*
(sans les apostrophes) qui est une variable.

var truc = 'machin';
var machin = 'muche';
alert( eval(truc) === machin ); // TRUE

alors que

alert( 'machin' === machin); // FALSE of course

--
laurent


Avatar
Laurent vilday

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


Oui ou encore sans le eval() ce serait mieux :)


Désolé mais ... non.


Je crois que je viens de comprendre pourquoi on est pas d'accord, pour
une fois que j'essayais de pas m'étaler sur le sujet, pensant que
l'exemple juste en dessous de ce que tu as quoté était suffisant pour
comprendre le sens de ma phrase. Encore une fois, ça m'apprendra :D

Quand je disais "sans le eval() ce serait mieux", c'était pas dans le
sens il faut ecrire alert(truc), c'était à lire dans le sens : eval()
est une grosse saloperie inutile qui peut presque toujours etre
remplacée par qqchose de beaucoup plus efficace. Grosso modo, eval()
n'est à utiliser que si on comprend ce qu'on fait et pourquoi on le fait
et à fuir comme la peste dans *tous* les autres cas.

--
laurent



Avatar
ASM

var truc = 'machin';
var machin = 'muche';

alert(eval(truc)); donnera 'muche'


Oui ou encore sans le eval() ce serait mieux :)


Désolé mais ... non.


Je crois que je viens de comprendre pourquoi on est pas d'accord,


On est tt à fait d'accord, j'ai moi aussi conseillé à l'un ou l'autre de
se passer d'eval().

Néanmoins, malgré ce que tu en dis, il lui arrive de fonctionner même si
ce n'est pas bien de s'en servir pour une foultitude de raisons.

Mon propos n'était que de dire : ça existe en JS

l'exemple juste en dessous de ce que tu as quoté était suffisant pour
comprendre le sens de ma phrase.


Il est vrai que je me suis arrêté à *sans*
et n'ai compris ton exemple que comme une espèce de "tricherie"
sans eval === avec autre chose

eval()
est une grosse saloperie inutile qui peut presque toujours etre
remplacée par qqchose de beaucoup plus efficace.


J'espérais bien que quelqu'un viendrait compléter pour expliquer que
c'était mal :-)

Grosso modo, eval()
n'est à utiliser que si on comprend ce qu'on fait et pourquoi on le fait
et à fuir comme la peste dans *tous* les autres cas.



--
Stephane Moriaux et son [moins] vieux Mac




1 2