Maison  >  Article  >  interface Web  >  Explication détaillée de l'utilisation de eval en JavaScript

Explication détaillée de l'utilisation de eval en JavaScript

黄舟
黄舟original
2017-11-23 11:00:081918parcourir

Dans notre travail de développement quotidien, je pense que de nombreux amis connaissent l'utilisation d'eval en JavaScript, mais pour ceux qui sont nouveaux dans JavaScript, l'utilisation d'eval est un peu inconnue. Aujourd'hui, nous le ferons. vous donne une explication détaillée de l'utilisation de eval en JavaScript ! La fonction

eval reçoit un paramètre s. Si s n'est pas une chaîne, elle renvoie s directement. Sinon, exécutez l'instruction s. Si le résultat de l'exécution de l'instruction s est une valeur, cette valeur est renvoyée, sinon undéfini est renvoyé.
Il est important de noter que la syntaxe de déclaration d'objet "{}" ne peut pas renvoyer de valeur. Elle doit être mise entre parenthèses pour renvoyer une valeur. Un exemple simple est le suivant :

. Le code est le suivant :

var code1='"a" + 2'; //表达式 
varcode2='{a:2}'; //语句 
alert(eval(code1)); //->'a2' 
alert(eval(code2)); //->undefined 
alert(eval('(' + code2 + ')')); //->[object Object]

Comme vous pouvez le voir, l'instruction de déclaration d'objet est uniquement exécutée et ne peut pas renvoyer de valeur. Afin de renvoyer l'instruction de déclaration d'objet "{}" couramment utilisée, elle doit être mise entre parenthèses pour la convertir en expression avant que sa valeur puisse être renvoyée. C'est également l'un des principes de base de l'utilisation de JSON pour le développement Ajax. On peut clairement voir dans l'exemple que la deuxième instruction d'alerte génère un élément non défini, tandis que la troisième, après avoir ajouté des parenthèses, affiche l'objet représenté par l'instruction.
Parlons maintenant de l'objet de cet article, comment exécuter du code global au sein d'une fonction. Pour illustrer ce problème, regardons d'abord un exemple :

Le code est le suivant :

var s='global'; //定义一个全局变量 
function demo1(){ 
eval('var s="local"'); 
} 
demo1(); 
alert(s); //->global

C'est facile à comprendre. La fonction demo1 ci-dessus est équivalente à : function. demo1(){var s ='local';}, qui définit une variable locale s.
Il n'est donc pas surprenant que le résultat final soit global. Après tout, tout le monde peut clairement distinguer les variables locales des variables globales.
Si vous l'expérimentez attentivement, vous pouvez trouver les caractéristiques de la fonction eval. Elle est toujours exécutée dans l'espace de variable contextuelle (également appelé : package, fermeture) où elle est appelée. Cela est vrai qu'il s'agisse d'une définition de variable. ou une définition de fonction, donc comme suit Le code générera une erreur de fonction non définie :

Le code est le suivant :

var s='function test(){return 1;}'; //一个函数定义语句 
function demo2(){ 
eval(s); 
} 
demo2(); 
alert(test()); //->error:test is not defined

C'est parce que la fonction de test est définie dans l'espace local et accessible dans la fonction demo2 mais pas de l'extérieur. Pas ici.
Dans le développement Ajax actuel, nous devons parfois obtenir dynamiquement du code du serveur pour l'exécuter afin d'atténuer le problème du chargement de trop de code à la fois, ou certains codes sont générés par Javascript lui-même et nous espérons utiliser la fonction eval. exécution.
Mais une telle acquisition de code dynamique se fait généralement au sein d'une fonction, par exemple :

Le code est le suivant :

function loadCode(){ 
varcode=getCode(); 
eval(code); 
}

On voit que eval ne peut pas être exécuté dans l’espace mondial. Cela a posé beaucoup de problèmes au développement, et j’ai vu de nombreuses personnes frustrées par cela.
Mais maintenant j'ai enfin trouvé une solution. Hé, elle peut être compatible avec IE et Firefox en même temps. La méthode est la suivante :

Le code est le suivant :

.
var X2={} //my namespace:) 
X2.Eval=function(code){ 
if(!!(window.attachEvent && !window.opera)){ 
//ie 
execScript(code); 
}else{ 
//not ie 
window.eval(code); 
} 
}

Maintenant, si vous souhaitez définir le code global au sein de la fonction, vous pouvez appeler la variable globale s="local" est définie.
Il convient de noter que X2.Eval ne renvoie pas de valeur. Si vous souhaitez évaluer une expression, vous devez toujours utiliser la fonction eval du système. X2.Eval est conçu pour être utilisé uniquement pour la définition globale du code.

En fait, après avoir vu cela, certaines personnes peuvent penser que le problème est trop facile à résoudre, haha, mais trouver cette méthode demande un peu de chance et de compétences :

(1) Pour

Navigateur IE
var s='global'; 
function demo3(){ 
X2.Eval('var s="local"'); 
} 
demo3(); 
alert(s); //->'local'
, Une telle fonction est fournie par défaut : execScript, qui est utilisée pour exécuter du code dans l'espace global, mais peu de gens le savent.

(2) Pour le navigateur Firefox, si la fonction eval est appelée directement, elle sera exécutée dans l'espace de l'appelant ; si window.eval est appelée, elle sera exécutée dans l'espace global. Il y a probablement encore moins de gens qui le savent. Après tout, alert(eval==window.eval) renvoie true !
Les caractéristiques de la fonction eval de Firefox sont effectivement très étranges, mais sa source se retrouve également dans la spécification JavaScript :

Cela signifie que l'exécution de la fonction eval est liée à l'appelant, mais il ne parle pas de son contexte d'exécution. Il est donc difficile de dire lequel a raison ou tort entre IE et Firefox. C’est bien que tout le monde connaisse la solution.


If value of the eval property is used in any way other than a direct call (that is, other than by the explicit use of its 
name as an Identifier which is the MemberExpression in a CallExpression), or if the eval property is assigned to, 
an EvalError exception may be thrown.
Résumé :


Cet article vous montre l'utilisation de eval en JavaScript à travers des exemples spécifiques que je crois que mes amis connaissent. eval. J'ai une compréhension et une compréhension plus approfondies de son utilisation, j'espère que cela sera utile à votre travail ! Recommandations associées :

Explication détaillée de la valeur de retour de la fonction eval() et des exemples d'utilisation de l'environnement variable en JavaScript

Une brève discussion sur le rôle et la portée de eval()

Comment utiliser eval() en JavaScript Explication détaillée du calcul de fonction Exemples de chaînes JavaScript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn