Résumé
Fonction Core
Évalue une chaîne de code JavaScript sans référence à un objet particulier.
Syntaxe
eval(chaîne[,
objet
])
Paramètres
-
chaîne
- Une chaîne représentant une expression, instruction ou série d'instructions JavaScript. Celles-ci peuvent contenir des variables et propriétés d'objets existants.
-
objet
- Un paramètre facultatif ; si spécifié, l'évaluation est restreinte au contexte de l'objet spécifié.
Description
eval
est une fonction globale et n'est associée à aucun objet.
Le paramètre de la fonction eval
est une chaîne de caractères (string). Si elle représente une expression, eval
évaluera celle-ci. S'il s'agit d'une ou plusieurs instructions JavaScript, eval
les exécutera. N'appelez pas eval
pour évaluer des expressions arithmétiques ; JavaScript le fait déjà automatiquement.
Si vous construisez une expression arithmétique dans une chaîne, vous pouvez utiliser eval
pour l'évaluer plus tard. Par exemple, supposons que vous ayez une variable x
. Vous pouvez postposer l'évaluation d'une expression faisant intervenir x
en assignant la valeur chaîne de l'expression, disons « 3 * x + 2
», à une variable, et en appelant eval
plus tard dans votre script.
Si le paramètre passé à eval
n'est pas une chaîne, eval
le renverra inchangé. Dans l'exemple qui suit, le constructeur String
est spécifié, et eval
renverra un objet String
plutôt que de l'évaluer.
eval(new String("2 + 2")); // renvoie un objet String contenant "2 + 2" eval("2 + 2"); // renvoie 4
Cette limitation peut être contournée d'une manière générique en utilisant toString
.
var expression = new String("2 + 2"); eval(expression.toString());
Il n'est pas possible d'utiliser la fonction eval
indirectement en l'invoquant par un autre nom qu'eval
; si vous le faites, une erreur d'exécution risque de se produire. Par exemple, il ne faut pas utiliser le code qui suit :
var x = 2; var y = 4; var monEval = eval; monEval("x + y");
Il ne faut pas non plus utiliser eval
pour convertir des noms de propriétés en propriétés. Imaginons l'exemple suivant : une fonction getFieldName(n)
renvoie le nom de l'élément de formulaire spécifié dans une chaîne. La première instruction assigne la valeur chaîne du troisième élément de formulaire à la variable field
. La seconde instruction utilise eval
pour afficher la valeur de l'élément de formulaire.
var field = getFieldName(3); document.write("Le champ appelé ", field, " a une valeur de ", eval(field + ".value"));
En réalité, eval
n'est pas nécessaire ici. Son utilisation est même déconseillée. Utilisez plutôt les Opérateurs de membres, qui sont nettement plus rapides :
var field = getFieldName(3); document.write("Le champ appelé ", field, " a une valeur de ", field[value]);
Ne pas utiliser eval !
eval()
est une fonction dangereuse qui exécute le code passé en argument avec les privilèges de l'appelant. Si vous lancez eval()
avec une chaine qui pourrait être altéré par un tiers, vous pourriez exécuter du code malicieux sur la machine de l'utilisation avec les permissions de votre page web / extension.
Il existe des alternatives à eval()
pour la plupart des cas.
Evaluer du JSON
// Compatible nativement depuis Firefox 3.5 var mon_json = '{"property":"value","proterty2":[1,2,3]}'; var json_evalued = JSON.parse(mon_json);
Accéder à une propriété d'un objet
Vous ne devez pas utiliser eval pour transformer un nom de propriété en propriété. Dans l'exemple ci-dessous, nous ne savons pas à quelle propriété nous souhaitons accéder.
Cela peut être fait avec eval :
var obj = { a: 20, b: 30 }; var propname = getPropName(); // Retourne "a" ou "b" eval( "var result = obj." + propname );
Cependant, l'utilisation d'eval est inutile ici. Une alternative plus simple et plus rapide existe :
var obj = { a: 20, b: 30 }; var propname = getPropName(); // Retourne "a" ou "b" var result = obj[propname];
Compatibilité avec les versions antérieures
JavaScript 1.3 et inférieur
eval
peut être utilisée indirectement, même si c'est déconseillé.
JavaScript 1.1
eval
est également une méthode de tous les objets.
Exemples
Les exemples qui suivent affichent des informations à l'aide de document.write
. En JavaScript côté serveur, on peut afficher les mêmes informations en appelant la fonction write
plutôt que document.write
.
Exemple : utilisation d'eval
Dans le code suivant, chacune des instructions contenant eval
renvoie 42. La première évalue la chaîne "x + y + 1"
; et la seconde "42"
.
var x = 2; var y = 39; var z = "42"; eval("x + y + 1"); // renvoie 42 eval(z); // renvoie 42
Exemple : utilisation d'eval
pour évaluer une série d'instructions JavaScript
L'exemple qui suit utilise eval
pour évaluer la chaîne str
. Celle-ci est composée d'instructions JavaScript qui ouvrent une fenêtre d'alerte et assignent à la variable z
une valeur de 42 si x
vaut cinq, ou de 0 dans les autres cas. Lorsque la seconde instruction est exécutée, eval
provoquera l'exécution de ces instructions, évaluera également la série d'instruction et renverra la valeur qui est assignée à z
.
var str = "if (x == 5) {alert('z vaut 42'); z = 42;} else z = 0; "; document.write("<P>z vaut ", eval(str));
Valeur de retour
eval
renvoie la valeur de la dernière expression évaluée.
var str = "if ( a ) { 1+1; } else { 1+2; }"; var a = true; var b = eval(str); // renvoie 2 alert("b vaut : " + b); a = false; b = eval(str); // renvoie 3 alert("b vaut : " + b);
Voir aussi