最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中的eval()函數(shù)詳解

 更新時間:2013年08月22日 15:01:19   作者:  
和其他很多解釋性語言一樣,JavaScript同樣可以解釋運行由JavaScript源代碼組成的字符串,并產(chǎn)生一個值。JavaScript通過全局函數(shù)eval()來完成這個工作

eval(“1+2”),-> 3

      動態(tài)判斷源代碼中的字符串是一種很強大的語言特性,幾乎沒有必要在實際中應用。如果你使用了eval(),你應當仔細考慮是否真的需要使用它。

一、eval()是一個函數(shù)還是一個運算符

eval()是一個函數(shù),但由于它已經(jīng)被當成運算符來對待了。。JavaScript語言的早期版本定義了eval函數(shù),現(xiàn)代JavaScript解釋器進行了大量的代碼分析和優(yōu)化。而eval的問題在于,用于動態(tài)執(zhí)行的代碼通常來講不能分析,換句話說,如果一個函數(shù)調用了eval,那么解釋器將無法對這個函數(shù)做進一步優(yōu)化,而將eval定義為函數(shù)的另一個問題是,它可以被賦予其他的名字,var f=eval;那么解釋器就無法放心的優(yōu)化任何調用了f()的函數(shù)。而當eval是一個運算符的時候,就可以避免這些問題。

二、eval()

eval()只有一個參數(shù)。如果傳入的參數(shù)不是字符串,它直接返回這個函數(shù)。如果參數(shù)是字符串,它會把字符串當成JavaScript代碼進行編譯,如果編譯失敗者拋出一個語法錯誤異常。如果編譯成功,則開始執(zhí)行這一段代碼,并返回字符串中的最后一個表達式會或語句的值,如果最后一個表達式或語句沒有值,則最終返回undefined。如果字符串拋出一個異常,這個異常將把該調用傳遞給eval()。

關于eval最重要的是,它使用了調用它的變量作用域環(huán)境。也就是說,它查找變量的值和定義新變量和函數(shù)的操作和局部作用域中的代碼完全一樣。如果一個函數(shù)定義了一個局部變量x,然后調用eval(“x”),它會返回局部變量的值。如果它調用eval(“x=1”),它會改變局部變量的值。如果函數(shù)調用了eval(“var y=2;”),它聲明了一個新的局部變量y,同樣地,一個函數(shù)可以通過如下代碼聲明一個局部變量:

eval(“function f(){return x+1;}”);

如果在最頂層的代碼中調用eval,當然,它會作用于全局變量和全局函數(shù)。

需要注意的是,傳遞給eval的字符串必須在語法上將的通,不能通過eval往函數(shù)中任意粘貼代碼片段,比如:eval(“return ;”)是沒有意義的,因為return只有在函數(shù)中才起到作用,并且事實上,eval的字符串執(zhí)行時的上下文環(huán)境和調用函數(shù)的上下文環(huán)境是一樣的,這不能使其作為函數(shù)的一部分來運行。如果字符串作為一個單獨的腳本是有語義的,那么將其傳遞給eval作參數(shù)是完全沒有問題的,否則,eval會拋出語法錯誤異常。

三、全局eval()

eval()具有更改布局變量的能力,這對于JavaScript優(yōu)化器來說是一個很大的問題。然而作為一種權宜之計,JavaScript解釋器針對那些調用了eval的函數(shù)所做的優(yōu)化并不多。但當腳本定義了eval的一個別名,且用另一個名稱調用它,JavaScript解釋器又會如何工作呢?為了讓JavaScript解釋器的實現(xiàn)更加簡化,ECMAScript3標準規(guī)定了任何解釋器都不允許對eval賦予別名。如果eval函數(shù)通過別名調用的話,則會拋出一個EavlError異常。

實際上,大多數(shù)的實現(xiàn)并不是這么做的。當通過別名調用時,eval會將其字符串當成頂層的全局代碼來執(zhí)行。執(zhí)行的代碼可能會定義新的全局變量和全局函數(shù),或者給全局變量賦值,但卻不能使用或者修改主調函數(shù)中的局部變量,因此,這不會影響到函數(shù)內的代碼優(yōu)化。

ECMAScript5是反對使用EavlError的,并且規(guī)范了eval的行為,“直接的eval”,當直接使用非限定的“eval”名稱來調用eval()函數(shù)時,通常稱為“直接eval”。直接調用eval()時,它總是在調用它的上下文作用域內執(zhí)行。其他的間接調用則使用全局對象作為其上下文作用域,并且無法讀、寫、定義局部變量和函數(shù)。下面有一段示例代碼:

復制代碼 代碼如下:

var geval=eval;                //使用別名調用evla將是全局eval
var x="global",y="global";    //兩個全局變量
function f(){                //函數(shù)內執(zhí)行的是局部eval
    var x="local";            //定義局部變量
    eval("x += ' chenged';");//直接使用eval改變的局部變量的值
    return x;                //返回更改后的局部變量
}
Function g(){                //這個函數(shù)內執(zhí)行了全局eval
    var y="local";
    geval("y += ' changed';"); //直接調用改變了全局變量的值
    return y;
}
console.log(f(),x);            //改變了布局變了,輸出 “l(fā)ocal changed global”
console.log(g(),y);            //改變了全局變量,輸出    “l(fā)ocal global changed”

全局的eval的這些行為不僅僅是處于代碼優(yōu)化其的需要而作出的一種折中方案,它實際上是一種非常有用的特性,它允許我們執(zhí)行那些對上下文沒有任何依賴的全局腳本代碼段。真正需要eval來執(zhí)行代碼段的場景并不多見。但當你真的意識到它的必要性的時候,你更可能會使用全局eval而不是局部eval。

四、嚴格eval()

ECMAScript5嚴格模式對eval()函數(shù)的行為施加了更多的限制,甚至對標識符eval的使用也施加了限制。當在嚴格模式下調用eval時,或者eval執(zhí)行的代碼段以“Use strict” 指令開始,這里的eval是私有上下文環(huán)境中的局部eval。也就是說,在嚴格模式下,eval執(zhí)行的代碼段可以查詢或更改局部變量,但不能在局部作用域中定義新的變量或函數(shù)。

此外,嚴格模式將“eval”列為保留字,這讓eval()更像一個運算符。不能用一個別名覆蓋eval()函數(shù)。并且變量名,函數(shù)名。函數(shù)參數(shù)或者異常捕獲的參數(shù)都不能取名為eval。

寶劍鋒從磨礪出,梅花香自苦寒來。

相關文章

  • onkeyup,onkeydown和onkeypress的區(qū)別介紹

    onkeyup,onkeydown和onkeypress的區(qū)別介紹

    三者在事件的響應上還有一點不同,就是onkeydown 、onkeypress事件響應的時候輸入的字符并沒有被系統(tǒng)接受,而響應onkeyup的時候,輸入流已經(jīng)被系統(tǒng)接受
    2013-10-10
  • 使用AmplifyJS組件配合JavaScript進行編程的指南

    使用AmplifyJS組件配合JavaScript進行編程的指南

    這篇文章主要介紹了使用AmplifyJS組件配合JavaScript進行編程的指南,AmplifyJS中提供的訂閱功能十分強大,需要的朋友可以參考下
    2015-07-07
  • Javascript typeof與instanceof的區(qū)別

    Javascript typeof與instanceof的區(qū)別

    JavaScript 中 typeof 和 instanceof 常用來判斷一個變量是否為空,或者是什么類型的。但它們之間還是有區(qū)別的,需要的朋友可以參考下
    2016-10-10
  • JavaScript基礎知識學習筆記

    JavaScript基礎知識學習筆記

    本文是初學javascript的時候記的學習筆記,簡單介紹了javascript的定義及用法,并附上示例,適合初學者們,老鳥請出門左轉。
    2014-12-12
  • JavaScript內核之基本概念

    JavaScript內核之基本概念

    本文將聚焦于JavaScript中的基本概念,這些概念與傳統(tǒng)語言有比較大的不同,因此單獨列出一章來做專門描述,理解本章的概念對書中后續(xù)章節(jié)的概念,代碼的行為等會有很大的幫助,讀者不妨花比較大的時間在本章,即使你對JavaScript已經(jīng)比較熟悉,也建議通讀本文
    2011-10-10
  • JavaScript中document對象使用詳解

    JavaScript中document對象使用詳解

    這篇文章主要介紹了JavaScript中document對象使用詳解,總結的十分詳盡,需要的朋友可以參考下
    2015-01-01
  • 推薦10款擴展Web表單的JS插件

    推薦10款擴展Web表單的JS插件

    本篇文章給大家介紹了10款擴展Web表單的javascript的插件,一起跟著小編來學習下吧。
    2017-12-12
  • js數(shù)組的操作指南

    js數(shù)組的操作指南

    這篇文章主要介紹了js數(shù)組的操作指南的相關資料,需要的朋友可以參考下
    2014-12-12
  • JavaScript入門教程(2) JS基礎知識

    JavaScript入門教程(2) JS基礎知識

    JavaScript 可以出現(xiàn)在 HTML 的任意地方。使用標記<script>…</script>,你可以在 HTML 文檔的任意地方插入 JavaScript,甚至在<HTML>之前插入也不成問題。
    2009-01-01
  • 聊一聊JavaScript作用域和作用域鏈

    聊一聊JavaScript作用域和作用域鏈

    這篇文章主要和大家一起聊一聊JavaScript作用域和作用域鏈,什么是JavaScript作用域和作用域鏈,感興趣的小伙伴們可以參考一下
    2016-05-05

最新評論

茌平县| 龙山县| 阳城县| 调兵山市| 鸡泽县| 铜陵市| 九江县| 平谷区| 鄂尔多斯市| 德惠市| 张家川| 波密县| 盐津县| 延庆县| 武宁县| 汶川县| 甘谷县| 武平县| 洛南县| 长寿区| 宁城县| 南京市| 永福县| 美姑县| 平罗县| 平谷区| 曲周县| 哈巴河县| 保靖县| 遂平县| 桃源县| 和政县| 大洼县| 绥化市| 望都县| 千阳县| 高尔夫| 田林县| 随州市| 兴安盟| 合水县|