2010-02-14 39 views
2

为什么不是eval致电alert("Summer")JavaScript eval

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

它与“夏”中的引号有什么关系?

+0

为什么你在引号内的所有东西都有括号? –

+0

如果你想在表达式中使用序列语句,可以使用','运算符:'eval('(caption =“Summer”,alert(caption))'';' –

回答

12
Uncaught SyntaxError: Unexpected token ; 

外括号毫无语法意义。试试这个:

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

只能使用正确的括号(分组操作符)评估*一个表达*,更多信息:http://bclary.com/2004/11/07/#a-11.1.6 – CMS

+1

@CMS不,这是错误的。只要每个表达式只返回一个值,分组操作符就可以评估无限表达式(由逗号分隔符分隔)。分组操作员然后将返回最后返回的值,例如, '(alert(“foo”),alert(“bar”),window.foo =“bar”,1,2,3)'将评估所有分组表达式,但只返回'3'。所以(@Aistina)正确的答案是,在parantheses里面的分号没有语法上的意义:'eval('(caption =“Summer”,alert(caption))'';' – headacheCoder

+0

@headacheCoder,表达式将被评估在你的例子中,但在最后,在最高级别(在评估分组操作符的级别),它的语法*就是*单个表达式*,逗号操作符允许这样做,你可以在这里检查它的语法:http ://es5.github.com/#x11.14(这是一个递归制作),你可以在下面的解析器中尝试你的例子:http://esparser.qfox.nl/,你会发现括号里只有一个此级别的表达式令牌。 – CMS

2

额外的括号是错误的,这是正确的:

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

Chrome的控制台:

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

这工作:

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

更更好的方式来做到这一点,避免语法问题做以下,

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

+1

但这里的评估是多余的。如果要评估的代码可以作为来自某个源的字符串(例如,ajax调用或甚至用户输入)提供,则评估仅有意义。但是如果你已经有代码作为代码,你不需要评估。对? – Frunsi