eval函數會評估一個給定的含有JavaScript代碼的字符串,並且試圖去執行包含在字符串裏的表達式或者一系列的合法的JavaScript語句。eval函數將把最後一個表達式或者語句所包含的值或引用作爲返回值。
eval評估JavaScript表達式:
var bar='bar';
var foobar =eval('"foo" + bar');
alert(foobar);
eval評估JavaScript語句:
var bar='bar';
var foobar =eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);
foobar=eval('if(bar == "bar") {bar="foo-bar";} else {bar = "bar-foo";}');
alert(foobar);
JSON的格式:
對象的字面量:
var objectLiteral={
name:"Objector.L",
};
JSON對象:
var jsonFormat={
"summary":"Blogs",
};
eval和JSON:
var jsonObject =eval("("+ jsonFormat+")");
爲什麼要加括號?
加上圓括號的目的是迫使eval函數在評估JavaScript代碼的時候強制將括號內的表達式(expression)轉化爲對象,而不是作爲語句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括號,那麼eval會將大括號識別爲JavaScript代碼塊的開始和結束標記,那麼{}將會被認爲是執行了一句空語句。
所以下面兩個執行結果是不同的:
alert(eval("{}");// return undefined
alert(eval("({})");// return object[Object]
JSON格式的名字部分爲什麼要加引號?
因爲eval函數會將{foo:”bar”}解釋成合法的JavaScript語句,而非表達式。但是人們往往想要的是讓eval將這段代碼解釋成一個對象。所以JSON格式會強制你去在名字的外側加上引號再結合圓括號,這樣eval就不會錯誤的將JSON解釋成代碼塊。
舉例說明
eval錯誤解析語義
alert(eval('{foo:"bar"}'));// return "bar", incorrect
eval正確解析JSON
alert(eval('({"foo": "bar"})'));// return JSON object, correct
理解eval的工作原理和json的嚴格的限定格式,合理結合eval和json應用於JavaScript的數據傳遞和對象轉換。
eval('{'+ jsonString+')');