2010-02-14 9 views
2

Pourquoi est-ce que cela ne signifie pas evalalert("Summer")?JavaScript eval

eval('(caption="Summer";alert(caption))'); 

Cela a-t-il quelque chose à voir avec les citations dans "Summer"?

+0

Pourquoi avez-vous des parenthèses autour de toutes les choses à l'intérieur des citations? –

+0

Si vous souhaitez séquencer des instructions dans une expression, utilisez l'opérateur ',': 'eval ('(caption =" Eté ", alert (légende))');' –

Répondre

12
Uncaught SyntaxError: Unexpected token ; 

Les parenthèses extérieures aucun sens syntaxique. Essayez ceci:

eval('caption="Summer";alert(caption)'); 
+4

Correct, les parenthèses (l'opérateur de regroupement) ne peuvent être utilisées pour évaluer * une expression *, plus d'infos: http://bclary.com/2004/11/07/#a-11.1.6 – CMS

+1

@CMS Non, c'est faux. L'opérateur de regroupement peut évaluer des expressions infinies (séparées par l'opérateur de virgule) tant que chaque expression renvoie exactement une valeur. L'opérateur de regroupement renvoie alors la dernière valeur renvoyée, par ex. '(alert (" foo "), alert (" bar "), window.foo =" bar ", 1, 2, 3)' évaluera toutes les expressions groupées mais seulement retournera '3'. Donc (@Aistina) la réponse correcte serait que le point-virgule à l'intérieur des parenthèses n'a aucun sens syntaxique: 'eval ('(caption =" Summer ", alerte (légende))');' – headacheCoder

+0

@headacheCoder, les expressions seront évaluées dans votre exemple, mais à la fin, * syntaxiquement * au plus haut niveau (au niveau où l'opérateur de regroupement est évalué) c'est juste * une seule expression *, l'opérateur de virgule le permet, vous pouvez vérifier sa grammaire ici: http : //es5.github.com/#x11.14 (c'est une production récursive) et vous pouvez essayer votre exemple dans l'analyseur suivant: http://esparser.qfox.nl/ et vous verrez que les parenthèses se tiennent juste un jeton Expression à ce niveau. – CMS

2

Les parenthèses supplémentaires sont erronées, cela est correct:

eval('caption="Summer";alert(caption)'); 
4

console Chrome:

eval('(caption="Summer";alert(caption))') 
SyntaxError: Unexpected token ; 

Cela fonctionne:

eval('caption="Summer"; alert(caption)') 
0

Une plus meilleure façon de le faire et éviter de problème de syntaxe est de faire suivre,

eval(function(){var x="test"; alert(x)}());

+1

Mais ici l'eval est superflu. Eval n'a de sens que si le code à évaluer est disponible sous la forme d'une chaîne provenant d'une source (par exemple un appel ajax ou même une entrée utilisateur). Mais vous n'avez pas besoin d'eval si vous avez déjà le code comme code. Droite? – Frunsi

Questions connexes