亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript中的eval()函數詳解

2019-11-20 22:22:37
字體:
來源:轉載
供稿:網友

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

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

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

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

二、eval()

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

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

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

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

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

三、全局eval()

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

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

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

復制代碼 代碼如下:

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

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

四、嚴格eval()

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美中文字幕| 国产99久久精品一区二区| 久久久久久美女| 亚洲欧美中文日韩v在线观看| 欧美成人免费大片| 国产精品久久久久久搜索| 69久久夜色精品国产69乱青草| 一区二区欧美亚洲| 97在线视频免费| 欧美孕妇毛茸茸xxxx| 97国产在线观看| 久久九九有精品国产23| 午夜欧美不卡精品aaaaa| 亚洲自拍偷拍网址| 国产精品久久久久久av福利软件| 不用播放器成人网| 亚洲精品影视在线观看| 91成人福利在线| 伊人久久五月天| 亚洲影视九九影院在线观看| 欧美精品www| 中文字幕免费精品一区| 5278欧美一区二区三区| 亚洲欧美日韩中文在线| 国产精品露脸av在线| 国产欧美婷婷中文| 久久精品久久精品亚洲人| 97av在线播放| 欧美精品免费在线观看| 国产精品精品视频一区二区三区| 国产精品视频一区二区三区四| 国产精品综合不卡av| 日韩av免费看网站| 久久久精品国产| 九九热在线精品视频| 精品日本美女福利在线观看| 伊人伊成久久人综合网站| 欧美激情亚洲另类| 国产精品视频网址| 久久亚洲一区二区三区四区五区高| 欧美一区亚洲一区| 国产精品一二三在线| 亚洲欧洲美洲在线综合| 国语自产精品视频在免费| 日本三级韩国三级久久| 亚洲第一精品福利| 精品欧美国产一区二区三区| 国产网站欧美日韩免费精品在线观看| 久久久精品久久久久| 91在线免费视频| 精品毛片三在线观看| 国产精品一区二区三区免费视频| 欧美日韩免费在线| 久久五月天色综合| 精品一区精品二区| 亚洲缚视频在线观看| 国产精品吹潮在线观看| 日韩av在线免费播放| 91精品久久久久久久| 2019中文字幕免费视频| 97超碰色婷婷| 国产成人精品视频在线观看| 456国产精品| 国产精品视频网址| 国产综合视频在线观看| 亚洲跨种族黑人xxx| 日韩精品亚洲精品| 国产成人一区二区三区小说| 国产日产欧美精品| 国产精品久久久久久久久久小说| 久久久久999| 日韩精品中文字幕视频在线| 91久久精品久久国产性色也91| 久久国产精品影视| 一区二区三区 在线观看视| 久久婷婷国产麻豆91天堂| 亚洲曰本av电影| 97久久精品国产| 欧美激情视频一区| 2019中文字幕全在线观看| 日韩电影在线观看中文字幕| 国产精品国产亚洲伊人久久| 国产成人精品一区二区| 欧美成人免费小视频| 欧美亚洲国产另类| 亚洲一区二区自拍| 亚洲香蕉av在线一区二区三区| 国产精品免费在线免费| 国产精品自产拍在线观看中文| 国产精品久久久久久亚洲调教| 国产成人免费91av在线| 5566成人精品视频免费| 97国产精品视频人人做人人爱| 国产精品电影网站| 欧美xxxx14xxxxx性爽| 亚洲影影院av| 欧美电影电视剧在线观看| 88xx成人精品| 色无极影院亚洲| 亚洲欧洲在线播放| 中文字幕亚洲无线码在线一区| 中文日韩在线观看| 国产精品视频网站| 国产网站欧美日韩免费精品在线观看| 亚洲三级av在线| 国产精品高潮呻吟久久av无限| 国产精品手机播放| 亚洲裸体xxxx| 欧美综合在线观看| 日韩成人av一区| 91中文在线视频| 美日韩丰满少妇在线观看| 九九视频这里只有精品| 国模精品系列视频| 国产欧美最新羞羞视频在线观看| 中文字幕日韩专区| 九九视频这里只有精品| 中文字幕欧美日韩va免费视频| 久久久噜噜噜久久| 国产精品久久久久久久午夜| 亚洲成人精品视频| 影音先锋欧美在线资源| 欧美激情xxxx| 96国产粉嫩美女| 亚洲欧美中文字幕在线一区| 亚洲视频在线看| 一区二区三区回区在观看免费视频| 精品国产31久久久久久| 欧美精品中文字幕一区| 欧美激情精品久久久久久变态| 亚洲精品国产精品自产a区红杏吧| 亚洲电影免费观看高清完整版| 亚洲欧美日韩综合| 在线亚洲男人天堂| 欧美日韩一区二区在线播放| 欧美激情国内偷拍| 国产成人亚洲综合91| 亚洲黄色www| 久久夜色精品亚洲噜噜国产mv| 久久成人精品视频| 91国产在线精品| 夜夜嗨av色综合久久久综合网| 国产精品流白浆视频| 91国产美女视频| 青青草成人在线| 国产精品成人aaaaa网站| 日本高清+成人网在线观看| 亚洲最大成人网色| 国产美女精品视频免费观看| 91精品视频播放| 日韩欧美国产免费播放| 日韩中文第一页| 欧美xxxx做受欧美.88| 国外视频精品毛片| 91沈先生在线观看| 国产精品视频999| 亚洲免费电影在线观看| 久久久久久久久久久成人| 久久国产精品久久久| 中国日韩欧美久久久久久久久| 国产精品爽爽ⅴa在线观看| 亚洲少妇中文在线| 91精品久久久久久久久| 久久久免费电影|