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

JavaScript學(xué)習(xí)小結(jié)之被嫌棄的eval函數(shù)和with語句實(shí)例詳解

 更新時(shí)間:2016年08月01日 11:01:46   作者:小火柴的藍(lán)色理想  
這篇文章主要介紹了JavaScript學(xué)習(xí)小結(jié)之被嫌棄的eval和with實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

前面的話

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

eval

定義

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

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

用法

  eval()只有一個(gè)參數(shù),如果傳入的參數(shù)不是字符串,它直接返回這個(gè)參數(shù)。如果參數(shù)是字符串,它會(huì)把字符串當(dāng)成javascript代碼進(jìn)行編譯。如果編譯失敗則拋出一個(gè)語法錯(cuò)誤(syntaxError)異常。如果編譯成功,則開始執(zhí)行這段代碼,并返回字符串中的最后一個(gè)表達(dá)式或語句的值,如果最后一個(gè)表達(dá)式或語句沒有值,則最終返回undefined。如果字符串拋出一個(gè)異常,這個(gè)異常將把該調(diào)用傳遞給eval()

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

作用域

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

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

別名

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

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 global
console.log(g(),y);//local globalchanged 

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

副作用

  javascript解釋器進(jìn)行了大量的代碼分析和優(yōu)化。而eval()的問題在于,用于動(dòng)態(tài)執(zhí)行的代碼通常不能分析,于是解釋器也無法對(duì)其進(jìn)行優(yōu)化,這會(huì)導(dǎo)致性能下降

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

嚴(yán)格模式

  由于eval()函數(shù)過于強(qiáng)大,嚴(yán)格模式對(duì)其進(jìn)行了嚴(yán)格的限制

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

'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作為標(biāo)識(shí)符

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

with

  定義with語句的目的主要是為了簡(jiǎn)化多次編寫同一對(duì)象的工作

  with語句將object添加到作用域鏈的頭部,然后執(zhí)行statement,最后把作用域鏈恢復(fù)到原始狀態(tài)

with(object){
  statement;
}

作用

  在對(duì)象嵌套層次很深的時(shí)候通常會(huì)使用with語句來簡(jiǎn)化代碼編寫。而本質(zhì)上是通過將一個(gè)對(duì)象的引用當(dāng)作作用域來處理,將對(duì)象的屬性當(dāng)作作用域中的標(biāo)識(shí)符來處理,從而創(chuàng)建了一個(gè)新的詞法作用域

  在客戶端javascript中,可能會(huì)使用類似下面這種表達(dá)式來訪問一個(gè)HTML表單中的元素

document.forms[0].address.value 

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

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

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

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

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

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

  如果o中沒有定義屬性x,下面代碼和不使用with語句的代碼x=1是一模一樣的。這是因?yàn)閷?duì)變量x進(jìn)行了LHS查詢,并將1賦值給它

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

副作用

  與eval類似,with語句的javascript代碼非常難于優(yōu)化,同時(shí)也會(huì)給調(diào)試代碼造成困難,并且同沒有使用with語句的代碼相比,它運(yùn)算得更慢

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

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

嚴(yán)格模式

  嚴(yán)格模式下,禁止使用with語句

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

最后

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

以上所述是小編給大家介紹的JavaScript學(xué)習(xí)小結(jié)之被嫌棄的eval函數(shù)和with語句實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • JS中把函數(shù)作為另一函數(shù)的參數(shù)傳遞方法(總結(jié))

    JS中把函數(shù)作為另一函數(shù)的參數(shù)傳遞方法(總結(jié))

    下面小編就為大家?guī)硪黄狫S中把函數(shù)作為另一函數(shù)的參數(shù)傳遞方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • 微信小程序?qū)崿F(xiàn)列表左右滑動(dòng)

    微信小程序?qū)崿F(xiàn)列表左右滑動(dòng)

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)列表左右滑動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • webpack構(gòu)建打包的性能優(yōu)化實(shí)戰(zhàn)指南

    webpack構(gòu)建打包的性能優(yōu)化實(shí)戰(zhàn)指南

    webpack是前端開發(fā)中比較常用的打包工具之一,另外還有g(shù)ulp,grunt,下面這篇文章主要給大家介紹了關(guān)于webpack構(gòu)建打包的性能優(yōu)化的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 在JavaScript 中按字母排序之如何在 JS 中按名稱排序

    在JavaScript 中按字母排序之如何在 JS 中按名稱排序

    有時(shí)你可能有一個(gè)單詞數(shù)組,你想按字母順序(從 a-z)對(duì)每個(gè)單詞進(jìn)行排序,或者你可能有一個(gè)包含用戶信息(包括名字)的對(duì)象數(shù)組,例如,你想按照用戶的名字來排序,接下來通過本文給大家介紹在JavaScript 中按字母排序之如何在 JS 中按名稱排序,需要的朋友可以參考下
    2023-09-09
  • JavaScript直播評(píng)論發(fā)彈幕切圖功能點(diǎn)集合效果代碼

    JavaScript直播評(píng)論發(fā)彈幕切圖功能點(diǎn)集合效果代碼

    這篇文章主要介紹了JavaScript直播評(píng)論發(fā)彈幕切圖功能點(diǎn)集合效果代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • JS highcharts動(dòng)態(tài)柱狀圖原理及實(shí)現(xiàn)

    JS highcharts動(dòng)態(tài)柱狀圖原理及實(shí)現(xiàn)

    這篇文章主要介紹了JS highcharts動(dòng)態(tài)柱狀圖原理及實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • javascript格式化指定日期對(duì)象的方法

    javascript格式化指定日期對(duì)象的方法

    這篇文章主要介紹了javascript格式化指定日期對(duì)象的方法,涉及javascript針對(duì)日期對(duì)象操作的相關(guān)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 新手如何快速理解js異步編程

    新手如何快速理解js異步編程

    這篇文章主要介紹了新手如何快速理解js異步編程,異步編程從早期的 callback、事件發(fā)布\訂閱模式到 ES6 的 Promise、Generator 在到 ES2017 中 async,看似風(fēng)格迥異,但是還是有一條暗線將它們串聯(lián)在一起的,,需要的朋友可以參考下
    2019-06-06
  • JavaScript中的迭代器和可迭代對(duì)象與生成器

    JavaScript中的迭代器和可迭代對(duì)象與生成器

    這篇文章主要介紹了JavaScript中的迭代器和可迭代對(duì)象與生成器,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • js函數(shù)和this用法實(shí)例分析

    js函數(shù)和this用法實(shí)例分析

    這篇文章主要介紹了js函數(shù)和this用法,結(jié)合實(shí)例形式分析了js函數(shù)和this基本功能、原理、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03

最新評(píng)論

恭城| 靖远县| 谷城县| 房山区| 墨玉县| 重庆市| 盐城市| 元朗区| 大新县| 长岭县| 班戈县| 赣州市| 彭阳县| 山丹县| 郑州市| 玛纳斯县| 自贡市| 阳高县| 临沧市| 贵溪市| 砚山县| 虹口区| 松潘县| 栾城县| 胶南市| 荔波县| 财经| 西华县| 遵义市| 仙游县| 新安县| 宜良县| 乌兰浩特市| 察隅县| 托克逊县| 文成县| 临朐县| 苍山县| 额敏县| 福州市| 柘城县|