先來說eval的用法,內容比較簡單,熟悉的可以跳過
eval函式接收一個引數s,如果s不是字串,則直接返回s。否則執行s語句。如果s語句執行結果是一個值,則返回此值,否則返回undefined。
需要特別注意的是物件宣告語法“{}”並不能返回一個值,需要用括號括起來才會返回值,簡單示例如下:
var s1='"a" + 2'; //表示式
var s2='{a:2}'; //語句
alert(eval(s1)); //->'a2'
alert(eval(s2)); //->undefined
alert(eval('(' + s2 + ')')); //->[object Object] 複製程式碼
可以看到,對於物件宣告語句來說,僅僅是執行,並不能返回值。
為了返回常用的“{}”這樣的物件宣告語句,必須用括號括住,以將其轉換為表示式,才能返回其值。這也是使用JSON來進行Ajax開發的基本原理之一。在例子中可以清楚的看到,第二個alert語句輸出的是undefined,而第三個加了括號 後輸出的是語句表示的object物件。
現在來說本文的重點,如何在函式內執行全域性程式碼。為了說明這個問題,先看一個例子:
var s='global'; //定義一個全域性變數
function demo1(){
eval('var s="local"');
}
demo1();
alert(s); //->global 複製程式碼
很好理解,上面的demo1函式等價於:function demo1(){var s='local';},其中定義了一個區域性變數s。
所以最後的輸出是global並不是什麼奇怪的事情,畢竟大家都能很清楚的區分區域性變數和全域性變數。