JS的全域函數eval解析JSON字串函數

來源:互聯網
上載者:User

標籤:each   innerhtml   get   state   www.   param   原因   大括弧   false   

JavaScript eval() 函數定義和用法

eval() 函數可計算某個字串,並執行其中的的 JavaScript 代碼。

文法
eval(string)
參數 描述
string 必需。要計算的字串,其中含有要計算的 JavaScript 運算式或要執行的語句。
傳回值

通過計算 string 得到的值(如果有的話)。

說明

該方法只接受原始字串作為參數,如果 string 參數不是原始字串,那麼該方法將不作任何改變地返回。因此請不要為 eval() 函數傳遞 String 對象來作為參數。

如果試圖覆蓋 eval 屬性或把 eval() 方法賦予另一個屬性,並通過該屬性調用它,則 ECMAScript 實現允許拋出一個 EvalError 異常。

拋出

如果參數中沒有合法的運算式和語句,則拋出 SyntaxError 異常。

如果非法調用 eval(),則拋出 EvalError 異常。

如果傳遞給 eval() 的 Javascript 代碼產生了一個異常,eval() 將把該異常傳遞給調用者。

 

例子 1

在本例中,我們將在幾個字串上運用 eval(),並看看返回的結果:

<script type="text/javascript">eval("x=10;y=20;document.write(x*y)")document.write(eval("2+2"))var x=10document.write(eval(x+17))</script>

 

輸出:

200427

例子 2

看一下在其他情況中,eval() 返回的結果:

eval("2+3")    // 返回 5var myeval = eval;    // 可能會拋出 EvalError 異常myeval("2+3");    // 可能會拋出 EvalError 異常

 

可以使用下面這段代碼來檢測 eval() 的參數是否合法:

try  {     alert("Result:" + eval(prompt("Enter an expression:","")));     }catch(exception) {     alert(exception);     }

 

 

 

 ------------------------------------------------eval()解析JSON字串為函數----------------------------------------------------

 

1.

var text = ‘{ "name":"Runoob", "alexa":"function () {return 10000;}", "site":"www.runoob.com"}‘;var obj = JSON.parse(text);obj.alexa = eval("(" + obj.alexa + ")"); document.getElementById("demo").innerHTML = obj.name + " Alexa 排名:" + obj.alexa();

 

 

 上面是取出function () {return 10000;}

然後通過eval()轉為函數

 

 

為什麼要 eval這裡要添加 “("("+data+")");//”呢?

原因在於:eval本身的問題。 由於json是以”{}”的方式來開始以及結束的,在JS中,它會被當成一個語句塊來處理,所以必須強制性的將它轉換成一種運算式。

加上圓括弧的目的是迫使eval函數在處理JavaScript代碼的時候強制將 括弧內的運算式(expression)轉化為對象,而不是作為語 句(statement)來執行。舉一個例子,例如對象字面量{},如若不加外層的括弧,那麼eval會將大括弧識別為JavaScript代碼塊的開始 和結束標記,那麼{}將會被認為是執行了一句空語句。所以下面兩個執行結果是不同的:
alert(eval("{}"); // return undefined
alert(eval("({})");// return object[Object]

對於這種寫法,在JS中,可以到處看到。

如: (function()) {}();  做閉包操作時等。

 

 

alert(dataObj.root.length);//輸出root的子物件數量
$.each(dataObj.root,fucntion(idx,item){
if(idx==0){
return true;
}
//輸出每個root子物件的名稱和值
alert("name:"+item.name+",value:"+item.value);
})
註:對於一般的js產生json對象,只需要將$.each()方法替換為for語句即可,其他不變。


2.對於伺服器返回的JSON字串,如果jquery非同步請求將type(一般為這個配置屬性)設為“json”,或者利 用$.getJSON()方法獲得伺服器返回,那麼就不需要eval()方法了,因為這時候得到的結果已經是json對象了,只需直接調用該對象即可,這 裡以$.getJSON方法為例說明資料處理方法:
$.getJSON("http://www.phpzixue.cn/",{param:"gaoyusi"},function(data){
//此處返回的data已經是json對象
//以下其他動作同第一種情況
$.each(data.root,function(idx,item){
if(idx==0){
return true;//同countinue,返回false同break
}
alert("name:"+item.name+",value:"+item.value);
});
});
這裡特別需要注意的是方式1中的eval()方法是動態執行其中字串(可能是js指令碼)的,這樣很容易會造成系統的安全問題。所以可以採用一些規避了eval()的第三方用戶端指令碼庫,比如JSON in JavaScript就提供了一個不超過3k的指令碼庫。

 

JS的全域函數eval解析JSON字串函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.