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

首頁 > 編程 > JavaScript > 正文

javascript中eval和with用法實例總結

2019-11-20 11:07:35
字體:
來源:轉載
供稿:網友

本文實例講述了javascript中eval和with用法。分享給大家供大家參考,具體如下:

我們都知道javascript的作用域機制,但是with和eval有時會“破壞”我們對于作用域的常規理解。下面參考網上資源和自己理解總結一下eval和with的用法。

一、eval

1、eval函數:把一個字符串當作一個js表達式一樣去執行它.

2、語法:eval(strScript) 注:參數strScript是必填項

3、使用說明

(1)它是有返回值的,如果參數字符串是一個表達式,就會返回表達式的值。如果參數字符串不是表達式,沒有值,那么返回“undefined”。
(2)參數字符串作為代碼執行時,是和調用eval函數的上下文相關的,即其中出現的變量或函數調用必須在調用eval的上下文環境中可用。

4、示例:

function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } } //eval,這個比較常用var myTest = function() { return "eval test"; };function evalTest() {  //簡單數據  alert(eval("1+1")); //2  alert(eval("'a'+1")); //a1  alert(eval("1+'a'")); //1a  alert(eval("parseInt('a'+1)")); //NaN  alert(eval("parseInt(1+'a')")); //1  alert(eval("true")); //true  alert(eval("0==false")); //true  alert(eval("1==undefined")); //false  alert(eval("isNaN(undefined)")); //true  //函數和對象  alert(eval("this")); //[object]  alert(eval("typeof(this)")); //object  alert(eval("typeof(test)")); //undefined  alert(eval("evalTest")); //這個顯示當前函數的定義語句細節,包含注釋  //alert(eval("evalTest()")); //調用自己并執行,這個會有大問題啊!  alert(eval("typeof(evalTest)")); //function  //其他  var tmpFunc = "{a:1}";  alert(eval(tmpFunc)); //1  alert(eval("(" + tmpFunc + ")")); //[object object]  alert(eval("tmpFunc")); //{a:1}  //alert(eval("tmpFunc()")); //腳本錯誤  alert(myTest());  eval("alert(myTest())"); //和上面等價  alert(eval(myTest));  alert(eval("myTest")); //和上面等價  //form里的一個input,id=txtUserName  eval("$('txtUserName').value='jeff wong';"); //等價于 $('txtUserName').value = 'jeff wong';  eval("alert( $('txtUserName').value);");}evalTest(); 

5、eval和作用域

(1)經典代碼分析

a、常見

var str = "global";function test() {  alert(str); //undefined  var str = "local";}test();alert(str); //global

分析:如我們預期的那樣,得到指定值。test函數內的str沒有var和有var聲明,結果也是不一樣的,讀者可自行驗證。

b、eval替代直接聲明變量的寫法

var str = "global";function test() {  alert(str); //??  eval("var str='local';");//會像我們預期的那樣嗎?  //var str = "local";  alert(str); //這里又是什么結果?}test();alert(str); //??

分析:對比a中的寫法,我們只是在test函數里用eval語句替換直接聲明var定義變量那一句最后alert一下而已,結果出入很大。

(2)eval定義全局代碼

a、兼容ie和ff的通用定義全局代碼的eval函數

var nav = new Object();//通用eval函數nav.Eval = function(jsCode) {  if (document.all) //IE下是execScript   execScript(jsCode);  else window.eval(jsCode); //FF下是window.eval}

對于IE瀏覽器,函數execScript用于在全局空間執行代碼。
對于Firefox瀏覽器,直接調用eval函數,則在調用者的空間執行;如果調用window.eval則在全局空間執行;但是alert(eval==window.eval)的返回值是true,奇怪的ff.

b、調用a的測試代碼

var nav = new Object();//通用eval函數nav.Eval = function(jsCode) {  if (document.all) //IE下是execScript   execScript(jsCode);  else window.eval(jsCode); //FF下是window.eval}function test() {  nav.Eval("var str = 'global';"); //這里聲明變量str,在外面的函數中可以調用變量  nav.Eval("var tmpFunc = function(){alert('global function');};"); //這里聲明函數變量tmpFunc,在外面的函數中可以調用函數  alert(str); //global  tmpFunc(); //global function}test();alert(str); //global (調用nav.Eval函數聲明的全局變量)tmpFunc(); // global function (調用nav.Eval函數聲明的全局函數)

分析:通過b中的代碼,你可能已經發現了eval定義全局代碼的一個顯而易見的不方便的地方,就是對于全局代碼,js智能提示(這里是vs,可能其他工具也會)完全失去提示作用。由此你肯定會問,程序中通過eval這種方式定義了很多全局代碼,它的可維護性會不會太那個了?我的看法就是贊成網上的總結,少用eval。畢竟現成的工具都不能很好的提示了,而程序員的視力往往又不是那么好。

二、with

1、with語句:為一個或一組語句指定默認對象,通常用來縮短特定情形下必須寫的代碼量。
2、語法:with (<對象>) <語句>
with (object)
  statements
(1)參數object: 新的默認對象;
(2)statements : 一個或多個語句,object 是該語句的默認對象。

3、示例:

function withTest() { with (document) { //document的重復使用 writeln("Hello,"); writeln("it's a with keyword test!"); } with (Math) { //Math的重復使用 alert(random()); alert(abs(-10)); }}withTest();

4、with會暫時修改作用域鏈

function withTest() { var userName = "jeff wong"; //暫時修改作用域鏈 with (document) { writeln("Hello,"); writeln(userName); }//with內的語句執行完之后,作用域鏈恢復原狀 alert(userName);}withTest();

分析: 函數withTest在定義的時候,就確定了withTest的作用域鏈,我們暫且認為這條作用域鏈的最頂端是window對象,當withTest被執行的時候,js引擎生成了一個call object(調用對象)并將其添加到作用域鏈尾部上(window對象之后),語句運行到with(document)時,將生成新的作用域(實質上這個作用域和普通function的作用域一樣,只不過它在with子句執行完,該作用域也隨之消失)并添加到作用域鏈的尾部,所以with之內的變量查找,就會優先從這條鏈的with(document)作用域上查找,然后從withTest的call object中查找,最后查找window。with內的語句執行完之后,作用域鏈恢復原狀(with(document)生成的作用域被移出作用域鏈)。

ps:with是不被推薦的,因為需要操作作用域鏈(移進、移出作用域),執行效率低下。

希望本文所述對大家JavaScript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一视频网站| 国产精品久久久久久久久久| 久久精品一区中文字幕| 在线视频国产日韩| 日韩久久免费电影| 国产亚洲精品高潮| 国产精品网红福利| 欧美性少妇18aaaa视频| 国产精品久久久久77777| 国产精品高潮呻吟久久av野狼| 久久婷婷国产麻豆91天堂| 日韩成人激情视频| 久久精品国产69国产精品亚洲| 一本久久综合亚洲鲁鲁| 国产精品一区二区性色av| 国产精品第10页| 欧美日韩成人黄色| 亚洲第一区中文99精品| 日韩成人中文字幕| 国产日韩在线播放| 精品国产福利视频| 亚洲国产精品va在线观看黑人| 久久久久亚洲精品国产| 国产91色在线播放| 日韩欧美视频一区二区三区| 57pao成人国产永久免费| 日韩欧美亚洲国产一区| 亚洲第一精品夜夜躁人人躁| 92看片淫黄大片看国产片| 日韩欧美精品在线观看| 69av成年福利视频| 欧美巨乳在线观看| 日产精品99久久久久久| 91欧美精品午夜性色福利在线| 亚洲第一色在线| 色狠狠久久aa北条麻妃| 国产成人精品视频在线观看| 国内精品小视频在线观看| 日韩免费观看高清| 欧美专区在线播放| 国产69精品久久久久9999| 日韩亚洲在线观看| 中文字幕国产日韩| 亚洲国产日韩精品在线| 亚洲天堂av高清| 国产精品成人av在线| 欧美理论片在线观看| 亚洲第一免费网站| 国产亚洲精品美女久久久久| 国产免费一区视频观看免费| 日韩影视在线观看| 米奇精品一区二区三区在线观看| 98精品国产高清在线xxxx天堂| 久久中文字幕国产| 亚洲免费精彩视频| 国产精品美女久久久免费| 深夜精品寂寞黄网站在线观看| 91精品视频免费观看| 欧美性极品少妇精品网站| 高清日韩电视剧大全免费播放在线观看| 伊人久久五月天| 国产精品青草久久久久福利99| 亚洲女人被黑人巨大进入| 亚洲精品一区在线观看香蕉| 国产成人精品一区二区| 精品亚洲国产成av人片传媒| 欧美日韩免费看| 久久这里只有精品视频首页| 中文字幕欧美日韩精品| 亚洲一区久久久| 国内精品模特av私拍在线观看| 日韩经典第一页| 2019av中文字幕| 国产精品尤物福利片在线观看| 欧美日韩国产色视频| 激情懂色av一区av二区av| 亚洲免费福利视频| 日本在线观看天堂男亚洲| 精品视频偷偷看在线观看| 精品中文字幕在线观看| 国产精品久久久| 疯狂做受xxxx欧美肥白少妇| 激情久久av一区av二区av三区| 欧美激情视频在线免费观看 欧美视频免费一| 欧美疯狂做受xxxx高潮| 欧美另类高清videos| 国产男女猛烈无遮挡91| 日韩精品视频免费专区在线播放| 久久精品青青大伊人av| 欧美另类老女人| 黑人巨大精品欧美一区二区| 性欧美暴力猛交69hd| 亚洲成人网久久久| 欧美日韩精品中文字幕| 91国产精品91| 在线视频欧美日韩精品| 国产精品白丝av嫩草影院| 麻豆乱码国产一区二区三区| 亚洲自拍偷拍一区| 久久久国产成人精品| 亚洲成人动漫在线播放| 久久精品视频99| 亚洲精品国产精品久久清纯直播| 日韩黄色av网站| 国产精品主播视频| 久久人人爽亚洲精品天堂| 国产婷婷色综合av蜜臀av| 国产99在线|中文| 久久久久国产视频| 亚洲美女喷白浆| 精品国产精品自拍| 亚洲一区二区三区久久| 在线a欧美视频| 色噜噜狠狠色综合网图区| 欧美精品videos另类日本| 日韩欧美一区视频| 国产丝袜视频一区| 亚洲第一福利网| www.欧美三级电影.com| 久久91亚洲精品中文字幕奶水| 国产精品久久国产精品99gif| 永久免费毛片在线播放不卡| 欧美在线免费看| 全球成人中文在线| 91高潮精品免费porn| 国内精品久久久久伊人av| 国产精品久久久久久av福利软件| 久久久久久久久久久人体| 日本精品视频在线观看| 亚洲天堂男人天堂| 97超视频免费观看| 欧美激情女人20p| 91欧美精品成人综合在线观看| 成人h片在线播放免费网站| 亚洲国产天堂网精品网站| 国产精品网红福利| 成人精品一区二区三区电影免费| 亚洲最大激情中文字幕| 亚洲美女性生活视频| 亚洲国产一区二区三区在线观看| 精品激情国产视频| 国产a级全部精品| 日本高清不卡的在线| 亚洲天堂开心观看| 成人a视频在线观看| 久久五月天综合| 欧美亚洲另类激情另类| 国产精品男人的天堂| 久久综合伊人77777蜜臀| 国产精品视频自在线| 91国产精品91| 久久全球大尺度高清视频| 久久久精品在线观看| 日韩av在线导航| 国产又爽又黄的激情精品视频| 久久天天躁狠狠躁夜夜躁2014| 国产丝袜一区视频在线观看| 日韩欧美综合在线视频| 日本一区二区在线免费播放| 亚洲午夜未满十八勿入免费观看全集| 北条麻妃99精品青青久久| 日本道色综合久久影院| 性色av一区二区三区在线观看| 久久久久久久久久久亚洲|