javascript eval()用法分析

來源:互聯網
上載者:User

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

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

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

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

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

 

需要特別注意的是對象聲明文法“{}”並不能返回一個值,需要用括弧括起來才會傳回值,簡單樣本如下:

 代碼如下 複製代碼

var code1='"a" + 2';    //運算式

    varcode2='{a:2}';      //語句

    alert(eval(code1));     //->'a2'

    alert(eval(code2));     //->undefined

    alert(eval('(' + code2 + ')'));    //->[object Object]

可 以看到,對於對象聲明語句來說,僅僅是執行,並不能傳回值。為了返回常用的“{}”這樣的對象聲明語句,必須用括弧括住,以將其轉換為運算式,才能返回其 值。這也是使用JSON來進行Ajax開發的基本原理之一。在例子中可以清楚的看到,第二個alert語句輸出的是undefined,而第三個加了括弧 後輸出的是語句表示的對象。
現在來說本文的重點,如何在函數內執行全域代碼。為了說明這個問題,先看一個例子:

 代碼如下 複製代碼

var s='global';    //定義一個全域變數

    function demo1(){

        eval('var s="local"');

    }

    demo1();

    alert(s);    //->global

很好理解,上面的demo1函數等價於:function demo1(){var s=’local’;},其中定義了一個局部變數s。
所以最後的輸出是global並不是什麼奇怪的事情,畢竟大家都能很清楚的區分局部變數和全域變數。
仔細體會一下,可以發現eval函數的特點,它總是在調用它的上下文變數空間(也稱為:包,closure)內執行,無論是變數定義還是函數定義都是如此,所以如下的代碼會產生函數未定義的錯誤:

 代碼如下 複製代碼

var s='function test(){return 1;}';     //一個函數定義語句

    function demo2(){

        eval(s);

    }

    demo2();

    alert(test());    //->error:test is not defined

這是因為test函數在局部空間定義,demo2函數內可以訪問到,外面就訪問不到了。

而在實際的Ajax開發中,有時我們需要從伺服器動態擷取代碼來執行,以減輕一次載入代碼過多的問題,或者是一些代碼是通過Javascript自身產生的,希望用eval函數來使其執行。
但這樣的動態擷取代碼的工作一般在函數內完成,比如:

 代碼如下 複製代碼

function loadCode(){

        varcode=getCode();

        eval(code);

    }

可見eval不可能在全域空間內執行,這就給開發帶來了不少問題,也看到過很多人為此鬱悶。
不過現在偶終於找到瞭解決辦法,嘿嘿,可以同時相容IE和Firefox,方法如下:

 代碼如下 複製代碼

var X2={}    //my namespace:)

    X2.Eval=function(code){

     if(!!(window.attachEvent && !window.opera)){

      //ie

      execScript(code);

     }else{

      //not ie

      window.eval(code);

     }

    }

現在如果要想在函數內定義全域代碼,就可以通過調用X2.eval_r(code)方法,一個例子如下:

 代碼如下 複製代碼

var s='global';

    function demo3(){

     X2.Eval('var s="local"');

    }

    demo3();

    alert(s); //->'local'

可見,在demo3函數內重新定義了全域變數s=”local”。
需要注意的是X2.Eval並不傳回值,如果要進行運算式的求值,還是用系統的eval函數。X2.Eval設計為僅做全域代碼定義用。

執行個體

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

 代碼如下 複製代碼

<script type="text/javascript">

eval("x=10;y=20;document.write(x*y)")

document.write(eval("2+2"))

var x=10
document.write(eval(x+17))

</script>輸出:

200
4
27


id是之前設定的參數,而在雙引號中的字串則是需要編譯的

例子:eval(id + "_icon.src="/imgs/collapse_up.gif'");


引用:
--------------------------------------------------------------------------------

 代碼如下 複製代碼
function tophide(id)    //id indicates menu
{
    if (top.topframeset.rows == "31,*")
    {
        top.topframeset.rows = "86,*";
        eval(id + "_icon.src="/imgs/collapse_up.gif'");
        eval(id + "_icon.alt='Collapse The Head'");
        head.style.display = "block"
        }
    else
    {
        top.topframeset.rows = "31,*";
        eval(id + "_icon.src="/imgs/collapse_down.gif'");
        eval(id + "_icon.alt='Expand The Head'");
        head.style.display = "none"
    }
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.