2010-02-14 36 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