Cet article analyse l'utilisation de la fonction eval en JavaScript avec des exemples. Partagez-le avec tout le monde pour votre référence. L'analyse spécifique est la suivante :
eval() n'a qu'un seul paramètre. Si le paramètre passé n'est pas une chaîne, ce paramètre sera renvoyé directement. Sinon, la chaîne sera compilée sous forme de code js. Si la compilation échoue, une exception d'erreur de syntaxe (SyntaxError) sera levée. Si la compilation réussit, le code sera exécuté et la valeur de la dernière expression ou instruction de la chaîne sera renvoyée ; si la dernière expression ou instruction n'a aucune valeur, undefined sera renvoyé. Si la chaîne lève une exception, l'exception transmettra l'appel à eval();
La chose la plus importante à propos deeval() est qu'il utilise l'environnement de portée de variable dans lequel il est appelé, c'est-à-dire que ses opérations de recherche de la valeur d'une variable et de définition de nouvelles variables et fonctions sont exactement les mêmes que le code dans le cadre local.
eval("var x = 100"); eval("var y = 11"); console.log(x * y); //x * y == 1100 eval("function foo(x){return Math.pow(x,x);}"); console.log(foo(5)); // 25
Le contexte dans lequel la chaîne d'évaluation est exécutée est le même que le contexte dans lequel la fonction est appelée, ce qui ne permet pas de l'exécuter dans le cadre de la fonction :
var foo = function(a){ eval(a); }; foo("return;");
Étant donné que le contexte dans lequel eval(a) est exécuté dans le code ci-dessus est global, l'utilisation de return dans le contexte global générera une erreur de syntaxe : return not in function.
eval() a la capacité de modifier les variables locales, ce qui est un gros problème pour l'optimiseur js. Afin de simplifier l'implémentation de l'interpréteur js, le standard ECMAScript3 stipule qu'aucun interprète n'est autorisé à attribuer des alias à eval(). Si la fonction eval() est appelée via un alias, une exception EvalError sera levée.
En fait, la plupart des implémentations ne sont pas comme ça. Lorsqu'il est appelé via un alias, eval() exécutera sa chaîne en tant que code global de niveau supérieur. L'exécution du code peut définir de nouvelles variables globales et fonctions globales, ou attribuer des valeurs aux variables globales, mais elle ne peut pas utiliser ou modifier les variables locales dans la fonction appelante principale, cela n'affectera donc pas l'optimisation du code dans la fonction.
Dans ECMAScript5, l'attitude est différente : elle s'oppose au lancement de l'exception EvalError. Dans ECMAScript5, lorsque la fonction eval() est appelée directement en utilisant un nom non qualifié, elle est généralement appelée « direct eval (direct eval) » ; lorsque eval() est appelée directement, elle est toujours exécutée dans la portée du contexte dans lequel elle se trouve. appelé. D'autres appels indirects utilisent l'objet global comme portée de contexte et ne peuvent pas lire, écrire et définir des variables et fonctions locales. (Mais en fait j'ai trouvé dans le test Firebug que les variables globales étaient modifiées :( )
Il existe très peu de scénarios dans lesquels une véritable évaluation est nécessaire pour exécuter un segment de code. L'évaluation globale peut être utilisée plus souvent que l'évaluation locale.
Les premières versions d'IE avant IE9 n'étaient pas d'évaluation globale lors de l'appel de eval() via un alias, mais IE définissait une fonction globale de execScript() pour compléter la fonction d'évaluation globale (eval() monocœur est légèrement différent, execScript () renvoie toujours null).
Le mode strict ECMAScript5 impose plus de restrictions sur le comportement de la fonction d'évaluation. Lors de l'exécution de code en utilisant eval ou eval en mode strict commençant par la directive "use strict", eval est une eval locale dans un contexte privé. De plus, le mode strict répertorie eval comme un mot réservé, ce qui fait de eval() un opérateur. . La fonction eval() ne peut pas être remplacée par un alias, et les noms de variables, les noms de fonctions, les paramètres de fonction ou les paramètres de capture d'exception ne peuvent pas être nommés « eval ».
.J'espère que cet article sera utile à la conception de la programmation JavaScript de chacun.