eval

  • Raccourci de la révision : JavaScript/Référence_JavaScript/Référence_JavaScript/Fonctions_globales/eval
  • Titre de la révision : eval
  • ID de la révision : 270726
  • Créé :
  • Créateur : Tiller
  • Version actuelle ? Non
  • Commentaire one or more formatting changes

Contenu de la révision

 

Résumé

Fonction Core

Évalue une chaîne de code JavaScript sans référence à un objet particulier.

Syntaxe

eval(chaîne{{ mediawiki.external(', 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

Opérateurs de membres

 

{{ languages( { "en": "en/Core_JavaScript_1.5_Reference/Global_Functions/eval", "es": "es/Referencia_de_JavaScript_1.5/Funciones_globales/eval", "pl": "pl/Dokumentacja_j\u0119zyka_JavaScript_1.5/Funkcje/eval", "zh-cn": "cn/JavaScript_1.5_\u6838\u5fc3\u53c2\u8003/\u5168\u5c40\u51fd\u6570/eval" } ) }}

Source de la révision

<p> </p>
<h3 id="R.C3.A9sum.C3.A9" name="R.C3.A9sum.C3.A9">Résumé</h3>
<p><strong>Fonction Core</strong></p>
<p>Évalue une chaîne de code JavaScript sans référence à un objet particulier.</p>
<h3 id="Syntaxe" name="Syntaxe">Syntaxe</h3>
<p><code> eval(<em>chaîne</em>{{ mediawiki.external(', <i>objet</i>') }}) </code></p>
<h3 id="Param.C3.A8tres" name="Param.C3.A8tres">Paramètres</h3>
<dl> <dt><code>chaîne</code> </dt> <dd>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.</dd> <dt><code>objet</code> </dt> <dd>Un paramètre facultatif ; si spécifié, l'évaluation est restreinte au contexte de l'objet spécifié.</dd>
</dl>
<h3 id="Description" name="Description">Description</h3>
<p><code>eval</code> est une fonction globale et n'est associée à aucun objet.</p>
<p>Le paramètre de la fonction <code>eval</code> est une chaîne de caractères (string). Si elle représente une expression, <code>eval</code> évaluera celle-ci. S'il s'agit d'une ou plusieurs instructions JavaScript, <code>eval</code> les exécutera. N'appelez pas <code>eval</code> pour évaluer des expressions arithmétiques ; JavaScript le fait déjà automatiquement.</p>
<p>Si vous construisez une expression arithmétique dans une chaîne, vous pouvez utiliser <code>eval</code> pour l'évaluer plus tard. Par exemple, supposons que vous ayez une variable <code>x</code>. Vous pouvez postposer l'évaluation d'une expression faisant intervenir <code>x</code> en assignant la valeur chaîne de l'expression, disons « <code>3 * x + 2</code> », à une variable, et en appelant <code>eval</code> plus tard dans votre script.</p>
<p>Si le paramètre passé à <code>eval</code> n'est pas une chaîne, <code>eval</code> le renverra inchangé. Dans l'exemple qui suit, le constructeur <code>String</code> est spécifié, et <code>eval</code> renverra un objet <code>String</code> plutôt que de l'évaluer.</p>
<pre>eval(new String("2 + 2")); // renvoie un objet String contenant "2 + 2"
eval("2 + 2");             // renvoie 4
</pre>
<p>Cette limitation peut être contournée d'une manière générique en utilisant <code>toString</code>.</p>
<pre>var expression = new String("2 + 2");
eval(expression.toString());
</pre>
<p>Il n'est pas possible d'utiliser la fonction <code>eval</code> indirectement en l'invoquant par un autre nom qu'<code>eval</code> ; si vous le faites, une erreur d'exécution risque de se produire. Par exemple, il ne faut pas utiliser le code qui suit :</p>
<pre>var x = 2;
var y = 4;
var monEval = eval;
monEval("x + y");
</pre>
<p>Il ne faut pas non plus utiliser <code>eval</code> pour convertir des noms de propriétés en propriétés. Imaginons l'exemple suivant : une fonction <code>getFieldName(n)</code> 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 <code>field</code>. La seconde instruction utilise <code>eval</code> pour afficher la valeur de l'élément de formulaire.</p>
<pre>var field = getFieldName(3);
document.write("Le champ appelé ", field, " a une valeur de ",
   eval(field + ".value"));
</pre>
<p>En réalité, <code>eval</code> n'est pas nécessaire ici. Son utilisation est même déconseillée. Utilisez plutôt les <a href="/fr/Référence_de_JavaScript_1.5_Core/Opérateurs/Opérateurs_de_membres" title="fr/Référence_de_JavaScript_1.5_Core/Opérateurs/Opérateurs_de_membres">Opérateurs de membres</a>, qui sont nettement plus rapides :</p>
<pre>var field = getFieldName(3);
document.write("Le champ appelé ", field, " a une valeur de ",
   field[value]);
</pre>
<h3 id="Ne.pas.utiliser.eval" name="Ne.pas.utiliser.eval">Ne pas utiliser eval !</h3>
<p><code>eval()</code> est une fonction dangereuse qui exécute le code passé en argument avec les privilèges de l'appelant. Si vous lancez <code>eval()</code> 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.<code><br>
</code></p>
<p>Il existe des alternatives à <code>eval()</code> pour la plupart des cas.</p>
<h4 id="Evaluer_du_JSON">Evaluer du JSON</h4>
<pre>// Compatible nativement depuis Firefox 3.5
var mon_json = '{"property":"value","proterty2":[1,2,3]}';
var json_evalued = JSON.parse(mon_json);</pre>
<h4 id="Acc.C3.A9der_.C3.A0_une_propri.C3.A9t.C3.A9_d'un_objet">Accéder à une propriété d'un objet</h4>
<p>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.<br>
Cela peut être fait avec eval :</p>
<pre>var obj = { a: 20, b: 30 };
var propname = getPropName();  // Retourne "a" ou "b"
eval( "var result = obj." + propname );
</pre>
<p>Cependant, l'utilisation d'eval est inutile ici. Une alternative plus simple et plus rapide existe :</p>
<pre>var obj = { a: 20, b: 30 };
var propname = getPropName();  // Retourne "a" ou "b"
var result = obj[propname];
</pre><h3 id="Compatibilit.C3.A9_avec_les_versions_ant.C3.A9rieures" name="Compatibilit.C3.A9_avec_les_versions_ant.C3.A9rieures">Compatibilité avec les versions antérieures</h3>
<h4 id="JavaScript_1.3_et_inf.C3.A9rieur" name="JavaScript_1.3_et_inf.C3.A9rieur">JavaScript 1.3 et inférieur</h4>
<p><code>eval</code> peut être utilisée indirectement, même si c'est déconseillé.</p>
<h4 id="JavaScript_1.1" name="JavaScript_1.1">JavaScript 1.1</h4>
<p><code>eval</code> est également une méthode de tous les objets.</p>
<h3 id="Exemples" name="Exemples">Exemples</h3>
<p>Les exemples qui suivent affichent des informations à l'aide de <code>document.write</code>. En JavaScript côté serveur, on peut afficher les mêmes informations en appelant la fonction <code>write</code> plutôt que <code>document.write</code>.</p>
<h4 id="Exemple_:_utilisation_d.27eval" name="Exemple_:_utilisation_d.27eval">Exemple : utilisation d'<code>eval</code></h4>
<p>Dans le code suivant, chacune des instructions contenant <code>eval</code> renvoie 42. La première évalue la chaîne <code>"x + y + 1"</code> ; et la seconde <code>"42"</code>.</p>
<pre>var x = 2;
var y = 39;
var z = "42";
eval("x + y + 1"); // renvoie 42
eval(z);           // renvoie 42 
</pre>
<h4 id="Exemple_:_utilisation_d.27eval_pour_.C3.A9valuer_une_s.C3.A9rie_d.27instructions_JavaScript" name="Exemple_:_utilisation_d.27eval_pour_.C3.A9valuer_une_s.C3.A9rie_d.27instructions_JavaScript">Exemple : utilisation d'<code>eval</code> pour évaluer une série d'instructions JavaScript</h4>
<p>L'exemple qui suit utilise <code>eval</code> pour évaluer la chaîne <code>str</code>. Celle-ci est composée d'instructions JavaScript qui ouvrent une fenêtre d'alerte et assignent à la variable <code>z</code> une valeur de 42 si <code>x</code> vaut cinq, ou de 0 dans les autres cas. Lorsque la seconde instruction est exécutée, <code>eval</code> provoquera l'exécution de ces instructions, évaluera également la série d'instruction et renverra la valeur qui est assignée à <code>z</code>.</p>
<pre>var str = "if (x == 5) {alert('z vaut 42'); z = 42;} else z = 0; ";
document.write("&lt;P&gt;z vaut ", eval(str));
</pre>
<h3 id="Valeur_de_retour" name="Valeur_de_retour">Valeur de retour</h3>
<p><code>eval</code> renvoie la valeur de la dernière expression évaluée.</p>
<pre>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);
</pre>
<h3 id="Voir_aussi" name="Voir_aussi">Voir aussi</h3>
<p><a href="/fr/Référence_de_JavaScript_1.5_Core/Opérateurs/Opérateurs_de_membres" title="fr/Référence_de_JavaScript_1.5_Core/Opérateurs/Opérateurs_de_membres">Opérateurs de membres</a></p>
<p> </p> <p>{{ languages( { "en": "en/Core_JavaScript_1.5_Reference/Global_Functions/eval", "es": "es/Referencia_de_JavaScript_1.5/Funciones_globales/eval", "pl": "pl/Dokumentacja_j\u0119zyka_JavaScript_1.5/Funkcje/eval", "zh-cn": "cn/JavaScript_1.5_\u6838\u5fc3\u53c2\u8003/\u5168\u5c40\u51fd\u6570/eval" } ) }}</p>
Revenir à cette révision