成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JS學(xué)習(xí)筆記 - eval() 是魔鬼

mengera88 / 621人閱讀

摘要:要牢記使用這些構(gòu)造函數(shù)來(lái)傳遞參數(shù),在大部分情況下,會(huì)導(dǎo)致類似的隱患,因此應(yīng)該也盡量避免使用這些函數(shù)。下面一個(gè)栗子使用構(gòu)造函數(shù)和是比較類似的,因此該函數(shù)的使用也需要十分小心。

  

本文章記錄本人在學(xué)習(xí) JavaScript 中看書(shū)理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。

小白使用 eval()

如果在代碼中使用了eval(),請(qǐng)記住一句話:“eval()是一個(gè)魔鬼”。該函數(shù)可以將任意的字符串當(dāng)做一個(gè)js代碼來(lái)執(zhí)行。當(dāng)需要討論的代碼是預(yù)先編譯好了(不是在動(dòng)態(tài)運(yùn)行時(shí)候決定),是沒(méi)有理由使用eval()的。例如,如果你知道點(diǎn)表示法,但是不知道下表表示法的情況(下面一個(gè)栗子)。

eval("myValue = myObject." + myKey + ";");

而不是這樣寫(xiě)(下面一個(gè)栗子)。

myValue = MyObject[myKey];
安全隱患

使用eval()是有一些安全隱患的,因?yàn)檫@樣做有可能執(zhí)行被篡改過(guò)的代碼(例如來(lái)自網(wǎng)絡(luò)的代碼)。這是在處理來(lái)自一個(gè)Ajax請(qǐng)求的JSON響應(yīng)時(shí)候常見(jiàn)的反模式。在那些情景下,最好是使用瀏覽器內(nèi)置的方法來(lái)解析JSON請(qǐng)求,以確保安全性和有效性。

還有eval()函數(shù)還減弱了應(yīng)用程序的安全性,因?yàn)樗o被請(qǐng)求的文本賦予了太多的權(quán)力,而且就像with語(yǔ)句執(zhí)行的方式一樣,它降低了語(yǔ)言的性能。

定時(shí)器

在編寫(xiě)js特效的時(shí)候,會(huì)常用setTimeout、setInterval()方法。要牢記使用這些構(gòu)造函數(shù)來(lái)傳遞參數(shù),在大部分情況下,會(huì)導(dǎo)致類似eval()的隱患,因此應(yīng)該也盡量避免使用這些函數(shù)。(下面一個(gè)栗子)

// bad
setTimeout("myFunc()", 1000);
setInterval("myFunc(1, 2, 3)", 1000);

// good
setTimeout(myFunc, 1000);
setInerval(function(){
    myFunc(1, 2, 3);
}, 1000);
new Function()

使用new Function()構(gòu)造函數(shù)和eval()是比較類似的,因此該函數(shù)的使用也需要十分小心。該函數(shù)是一個(gè)功能強(qiáng)大的函數(shù),但是通常容易被誤用。如果一定要使用eval()的話,可以考慮是new Function()來(lái)代替eval()。這樣做的一個(gè)潛在的好處就是由于在new Function()中的代碼將在局部變量函數(shù)空間中運(yùn)行,因此代碼中任何采用var定義的變量不會(huì)自動(dòng)成為全局變量(下面一個(gè)栗子)。

console.log(typeof un); // undefined
console.log(typeof deux); // undefined
console.log(typeof trois); // undefined

var jsstring = "var un = 1; console.log(un);"
eval(jsstring); // 1

jsstring = "var deux = 2; console.log(deux);"
eval(jsstring); // 2

jsstring = "var deux = 2; console.log(deux);"
(function(){
    eval(jsstring);
}()); // 3

console.log(typeof un); // number
console.log(typeof deux); // undefined
console.log(typeof trois); // undefined

還有就是eval()是會(huì)影響到作用域鏈的,而Function更像一個(gè)沙盒。無(wú)論在那里執(zhí)行Function,它都僅僅能看到全局作用域。因此對(duì)局部變量的影響比較?。ㄏ旅嬉粋€(gè)栗子)。

(function(){
    var local = 1;
    eval("local = 3; console.log(local)");
    console.log(local); // 3
}());

(function(){
    var local = 1;
    Function("console.log(typeof local);")(); // undefined
}());
嚴(yán)格模式下的 eval()

來(lái)自MDN:在嚴(yán)格模式下 eval 僅僅為被運(yùn)行的代碼創(chuàng)建變量, 所以 eval 不會(huì)影響到名稱映射到外部變量或者其他局部變量(下面一個(gè)栗子)。

var x = 17;
var evalX = eval(""use strict"; var x = 42; x");
assert(x === 17);
assert(evalX === 42);

更多的詳細(xì)內(nèi)容:嚴(yán)格模式 MDN

  

最后,如果文章有什么錯(cuò)誤和疑問(wèn)的地方,請(qǐng)指出。與sf各位共勉!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85762.html

相關(guān)文章

  • eval()不魔鬼,只被誤解了(翻譯)

    摘要:因?yàn)榈栏窭沟拇蠖鄶?shù)作品并沒(méi)有注明日期,所以,我不確定他是否是在年創(chuàng)造了這個(gè)術(shù)語(yǔ)。但這并不能說(shuō)明是魔鬼,這只是開(kāi)發(fā)工作流程中的一點(diǎn)問(wèn)題。中間人攻擊被認(rèn)為是的永遠(yuǎn)存在的危險(xiǎn),會(huì)受到蠕蟲(chóng)的的攻擊。 原文來(lái)自:https://www.nczonline.net/blog/2013/06/25/eval-isnt-evil-just-misunderstood/ 作者:Nicholas C.Z...

    elarity 評(píng)論0 收藏0
  • 在編寫(xiě)javascript時(shí)要注意的一些細(xì)節(jié)

    摘要:不單單是因?yàn)橐鸬摹S门c要注意的地方這里要注意的是這二個(gè)函數(shù)的第一個(gè)參數(shù)都會(huì)把指向還有第一個(gè)參數(shù)可以為但不要這樣用因?yàn)檫@樣等于自己隱式使用了。 自動(dòng)分號(hào)插入 Js不像其他語(yǔ)言強(qiáng)制要求;號(hào)結(jié)尾不然編譯不過(guò),原因是JS有自動(dòng);號(hào)的插入。 var text=function(){} text() 這樣你不加;號(hào)也能運(yùn)行其實(shí)在內(nèi)部js是需要;號(hào)去幫助解析的 var text=function(...

    Eric 評(píng)論0 收藏0
  • 前端性能優(yōu)化(JavaScript篇)

    摘要:像也是類似的也不建議使用,會(huì)降低性能,通過(guò)包裹的代碼塊,作用域鏈將會(huì)額外增加一層,降低索引效率對(duì)象的優(yōu)化緩存需要被使用的對(duì)象獲取數(shù)據(jù)的性能有如下順序從快到慢變量獲取數(shù)組下標(biāo)獲取對(duì)象的整數(shù)索引獲取對(duì)象屬性獲取對(duì)象非整數(shù)索引獲取。 正巧看到在送書(shū),于是乎找了找自己博客上記錄過(guò)的一些東西來(lái)及其無(wú)恥的蹭書(shū)了~~~ 小廣告:更多內(nèi)容可以看我的博客 優(yōu)化循環(huán) 如果現(xiàn)在有個(gè)一個(gè)data[]數(shù)組...

    KunMinX 評(píng)論0 收藏0
  • 前端性能優(yōu)化(JavaScript篇)

    摘要:像也是類似的也不建議使用,會(huì)降低性能,通過(guò)包裹的代碼塊,作用域鏈將會(huì)額外增加一層,降低索引效率對(duì)象的優(yōu)化緩存需要被使用的對(duì)象獲取數(shù)據(jù)的性能有如下順序從快到慢變量獲取數(shù)組下標(biāo)獲取對(duì)象的整數(shù)索引獲取對(duì)象屬性獲取對(duì)象非整數(shù)索引獲取。 正巧看到在送書(shū),于是乎找了找自己博客上記錄過(guò)的一些東西來(lái)及其無(wú)恥的蹭書(shū)了~~~ 小廣告:更多內(nèi)容可以看我的博客 優(yōu)化循環(huán) 如果現(xiàn)在有個(gè)一個(gè)data[]數(shù)組...

    kun_jian 評(píng)論0 收藏0
  • JSON學(xué)習(xí)筆記(一)

    先學(xué)習(xí)阮大神的 數(shù)據(jù)類型和Json格式 一、js中解析JSON的方式 eval() JSON.parse var jsondata = {staff:[{name:小紅,age:16},{name:小明,age:20},{name:小芳,age:18}]} var jsonobj = eval(( + jsondata + )) alert( jsonobj.staff[0].name); s...

    Scott 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<