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

首頁 > 編程 > JavaScript > 正文

JavaScript學習小結之被嫌棄的eval函數和with語句實例詳解

2019-11-20 09:21:39
字體:
來源:轉載
供稿:網友

前面的話

  eval和with經常被嫌棄,好像它們的存在就是錯誤。在CSS中,表格被嫌棄,在網頁中只是用表格來展示數據,而不是做布局,都可能被斥為不規范,矯枉過正。那關于eval和with到底是什么情況呢?本文將詳細介紹eval()函數和with語句

eval

定義

  eval()是一個全局函數,javascript通過eval()來解釋運行由javascript源代碼組成的字符串

var result = eval('3+2');console.log(result,typeof result);//5 'number' 

用法

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

var num = 1;var str = 'test';console.log(eval(num));//1console.log(eval(str));//ReferenceError: test is not defined var strLong1 = 'var x = 1;var y = 2;';console.log(eval(strLong1),x,y);//undefined 1 2var strLong2 = 'var x = 1; x++;';console.log(eval(strLong2),x);//1 2 

作用域

  eval()使用了調用它的變量作用域環境。也就是說,它查找變量的值和定義新變量和函數的操作和局部作用域中的代碼完全一樣

var b = 2;function foo(str,a){eval(str);console.log(a,b);}foo('var b = 3;',1);//1 3 

別名

  當通過別名調用時,eval()會將其字符串當做頂層的全局代碼來執行。執行的代碼可能會定義新的全局變量和全局函數,或者給全局變量賦值,但卻不能使用或修改函數中的局部變量

var geval = eval; var x = 'global',y = 'global'; function f(){var x = 'local';eval('x += "changed";');return x;}function g(){var y = 'local';geval('y += "changed";');return y;}console.log(f(),x);//localchanged globalconsole.log(g(),y);//local globalchanged 

  [注意]IE8-瀏覽器通過別名調用eval()和正常調用eval()的結果相同

副作用

  javascript解釋器進行了大量的代碼分析和優化。而eval()的問題在于,用于動態執行的代碼通常不能分析,于是解釋器也無法對其進行優化,這會導致性能下降

  與eval()類似的有setTimeout()、setInterval()、new Function()等,這些函數都可以以字符串作為參數,在程序運行時動態執行。這種執行機制帶來的好處無法抵消其性能上的損失,所以應該盡量避免使用

嚴格模式

  由于eval()函數過于強大,嚴格模式對其進行了嚴格的限制

  【1】不能通過eval()函數來創建變量或函數,但可以查詢和更改其值

'use strict';eval('var x = 1;');console.log(x);//ReferenceError: x is not defined'use strict';var x = 1;eval('x = 2;');console.log(x);//2 

  【2】禁止使用eval作為標識符

'use strict';var eval = 10;//SyntaxError: Unexpected eval or arguments in strict mode 

with

  定義with語句的目的主要是為了簡化多次編寫同一對象的工作

  with語句將object添加到作用域鏈的頭部,然后執行statement,最后把作用域鏈恢復到原始狀態

with(object){  statement;}

作用

  在對象嵌套層次很深的時候通常會使用with語句來簡化代碼編寫。而本質上是通過將一個對象的引用當作作用域來處理,將對象的屬性當作作用域中的標識符來處理,從而創建了一個新的詞法作用域

  在客戶端javascript中,可能會使用類似下面這種表達式來訪問一個HTML表單中的元素

document.forms[0].address.value 

  如果這種表達式在代碼中多次出現,則可以使用with語句將form對象添加到作用域鏈的頂層

with(document.forms[0]){name.value = '';address.value = '';emai.value = '';} 

  這種方法減少了大量的輸入,不用再為每個屬性名添加document.forms[0]前綴。這個對象臨時掛載在作用域鏈上,當javascript需要解析諸如address的標識符時,就會自動在這個對象中查找

  [注意]with語句提供了一種讀取對象的屬性的快捷方式,但它并不能創建對象的屬性

  如果對象o有一個屬性x,那么下面代碼給這個屬性賦值為1

var o = {x:0};with(o) x = 1;console.log(o.x);//1 

  如果o中沒有定義屬性x,下面代碼和不使用with語句的代碼x=1是一模一樣的。這是因為對變量x進行了LHS查詢,并將1賦值給它

var o = {};with(o) x = 1;console.log(o.x);//undefinedconsole.log(x);//1 

副作用

  與eval類似,with語句的javascript代碼非常難于優化,同時也會給調試代碼造成困難,并且同沒有使用with語句的代碼相比,它運算得更慢

  而且,如果with語句不當,還有可能造成變量泄漏,污染全局作用域的情況

var x = 1;var o = {};with(o){x = 2;}console.log(x);//2console.log(o.x);//undefined 

嚴格模式

  嚴格模式下,禁止使用with語句

//SyntaxError: Strict mode code may not include a with statement'use strict';var o = {};with(o){x = 2;}

最后

  使用eval和with會使得引擎無法在編譯時對作用域查找進行優化,從而導致性能下降,代碼運行變慢。因為eval和with在實際工作中很少使用,所以嚴格模式下的限制,對我們來說影響不大。就像比如外交部某一天發布公告,我國不再發放去牙買加的簽證,牙買加雖然都聽過,但大多數人這輩子都可能不去一回,所以,無所謂了。同樣地,eval和with被嫌棄不嫌棄的,也是無所謂了

以上所述是小編給大家介紹的JavaScript學習小結之被嫌棄的eval函數和with語句實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品欧美一区二区| 欧美极品在线视频| 精品美女永久免费视频| 欧美激情乱人伦一区| 国模精品一区二区三区色天香| 欧美电影免费播放| 亚洲性xxxx| 中文字幕av一区二区三区谷原希美| 欧美日韩福利在线观看| 正在播放国产一区| 亚洲a中文字幕| 欧美在线xxx| 中文字幕久久久| 国产精品一区二区久久国产| 亚洲精品wwwww| 亚洲女人天堂网| 欧美一区二区三区精品电影| 91精品国产高清久久久久久久久| 国产精品直播网红| 国产精品久久久999| 98精品国产自产在线观看| 国产男人精品视频| 久久亚洲精品一区二区| 国产成人精品综合久久久| 成人国产精品久久久| 欧美一级片在线播放| 深夜成人在线观看| 欧美性生交xxxxx久久久| 中文日韩在线观看| 国产网站欧美日韩免费精品在线观看| 黑人精品xxx一区一二区| 久久久久久久久久久国产| 国产成人精品av| 欧美日韩亚洲一区二区三区| 成人伊人精品色xxxx视频| 亚洲毛片一区二区| 尤物九九久久国产精品的特点| 欧美一区视频在线| 欧美人交a欧美精品| 最近2019中文字幕第三页视频| 国产精品99久久久久久www| 国产91ⅴ在线精品免费观看| 亚洲天堂男人天堂女人天堂| 国产不卡一区二区在线播放| 夜夜躁日日躁狠狠久久88av| 久久6免费高清热精品| 亚洲免费一在线| 欧美又大又粗又长| 亚洲欧美一区二区精品久久久| 最近2019免费中文字幕视频三| 综合激情国产一区| 亚洲色图综合网| 亚洲国产福利在线| 97视频色精品| 亚洲一区二区自拍| 伊人成人开心激情综合网| 久久99亚洲精品| 久久青草精品视频免费观看| 欧美美女操人视频| 亚洲色图综合网| 日韩在线播放一区| 欧美xxxx综合视频| 中文字幕亚洲色图| 久久在精品线影院精品国产| 国产性猛交xxxx免费看久久| 精品久久中文字幕久久av| 亚洲第一福利网| 欧美日韩中文字幕在线视频| 91亚洲永久免费精品| 亚洲一区二区福利| 日韩中文视频免费在线观看| 成人性教育视频在线观看| 亚洲国产高清高潮精品美女| 69**夜色精品国产69乱| 欧美美最猛性xxxxxx| 九九热99久久久国产盗摄| 日韩在线观看免费网站| 久久精品99久久久香蕉| 精品国产一区二区在线| 亚洲国产精品免费| 97色在线观看免费视频| 亚洲成人久久久| 日韩av网站大全| 国产在线拍偷自揄拍精品| 国产国语videosex另类| 一本色道久久88精品综合| 欧美成人久久久| 亚洲伊人久久大香线蕉av| 中文字幕av一区| 91超碰caoporn97人人| 欧美大尺度电影在线观看| 日韩欧美在线字幕| 欧美老妇交乱视频| 日韩av网站电影| 欧美大片在线免费观看| 国内精品小视频在线观看| 日韩女在线观看| 91在线网站视频| 亚洲色图13p| 日韩精品在线观看网站| 日韩中文有码在线视频| 国产精品福利小视频| 国产精品免费久久久久久| 日韩在线视频网| 国产精品视频男人的天堂| 亚州国产精品久久久| 欧美—级高清免费播放| 96精品久久久久中文字幕| 国产精品一区二区三区久久| 久久久成人精品| 日韩网站免费观看高清| 亚洲成人网在线| 国产精品久久久久久久久久三级| 精品国产一区二区三区四区在线观看| 日韩在线观看视频免费| 亚洲午夜女主播在线直播| 国产v综合v亚洲欧美久久| 亚洲综合大片69999| 懂色aⅴ精品一区二区三区蜜月| 亚洲精品一区二区网址| 成人h视频在线| 久久久久久久一区二区三区| 中国日韩欧美久久久久久久久| 国产精品久久久91| 亚洲欧美制服第一页| 亚洲女人天堂成人av在线| 欧美在线免费观看| 九色成人免费视频| 色婷婷综合成人| 欧美重口另类videos人妖| 亚洲va欧美va在线观看| 日韩在线小视频| 中文字幕亚洲欧美日韩在线不卡| 精品国产一区二区三区久久久| 国产精品久久久久久久午夜| 亚洲天堂影视av| 欧美性极品少妇精品网站| 26uuu久久噜噜噜噜| 亚洲人成网站777色婷婷| 亚洲电影免费观看高清完整版在线| 色777狠狠综合秋免鲁丝| 欧美性猛交xxxx免费看| 久久99精品国产99久久6尤物| 国产婷婷成人久久av免费高清| 亚洲男人天堂网| 尤物tv国产一区| 成人性生交大片免费看视频直播| 精品国产成人av| 欧美一级在线播放| 色偷偷888欧美精品久久久| 日韩av高清不卡| 国产精品第8页| 成人午夜在线观看| 97人洗澡人人免费公开视频碰碰碰| 亚洲综合自拍一区| 久久久精品久久| 国产精品三级久久久久久电影| 国产亚洲xxx| 国产精品久久久久久婷婷天堂| 欧美激情一区二区三区高清视频| 国产欧美在线看| 久久精品视频免费播放| 国产国语刺激对白av不卡| 欧美日韩一区二区免费在线观看|