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.
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
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
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.
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
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 :)
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 :)
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 :)
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
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.
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
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') ?
*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') ?
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') ?
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>
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>
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>
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
*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).
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
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
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
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.
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
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
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.