4 回答

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超2個(gè)贊
我想花一點(diǎn)時(shí)間來解決你的問題的前提 - eval()是“ 邪惡的 ”。編程語言人使用的“ 邪惡 ” 一詞通常意味著“危險(xiǎn)”,或者更準(zhǔn)確地說“能夠通過簡單的命令造成大量傷害”。那么,什么時(shí)候可以使用危險(xiǎn)的東西呢?當(dāng)您知道危險(xiǎn)是什么時(shí),以及何時(shí)采取適當(dāng)?shù)念A(yù)防措施。
至關(guān)重點(diǎn),我們來看看使用eval()的危險(xiǎn)性??赡艽嬖谠S多小的隱患,就像其他一切一樣,但兩個(gè)大的風(fēng)險(xiǎn) - eval()被認(rèn)為是邪惡的原因 - 是性能和代碼注入。
性能 - eval()運(yùn)行解釋器/編譯器。如果你的代碼是編譯的,那么這是一個(gè)很大的問題,因?yàn)槟阈枰谶\(yùn)行時(shí)調(diào)用一個(gè)可能很重的編譯器。但是,JavaScript仍然主要是一種解釋語言,這意味著在一般情況下調(diào)用eval()并不是一個(gè)很大的性能影響(但請(qǐng)參閱下面的具體說明)。
代碼注入 - eval()可能在提升的權(quán)限下運(yùn)行一串代碼。例如,以管理員/ root身份運(yùn)行的程序永遠(yuǎn)不會(huì)想要eval()用戶輸入,因?yàn)樵撦斎肟赡苁恰皉m -rf / etc / important-file”或更糟。同樣,瀏覽器中的JavaScript沒有這個(gè)問題,因?yàn)槌绦驘o論如何都在用戶自己的帳戶中運(yùn)行。服務(wù)器端JavaScript可能存在這個(gè)問題。
根據(jù)您的具體情況而定。根據(jù)我的理解,你自己生成字符串,所以假設(shè)你小心不要生成像“rm -rf something-important”這樣的字符串,那么就沒有代碼注入的風(fēng)險(xiǎn)(但請(qǐng)記住,它非常非常在一般情況下很難確保這一點(diǎn))。此外,如果你在瀏覽器中運(yùn)行,那么代碼注入是一個(gè)非常小的風(fēng)險(xiǎn),我相信。
至于性能,你將不得不重視編碼的簡易性。我認(rèn)為,如果你正在解析公式,你也可以在解析期間計(jì)算結(jié)果,而不是運(yùn)行另一個(gè)解析器(eval()中的一個(gè))。但是使用eval()進(jìn)行編碼可能更容易,并且性能損失可能不明顯。看起來eval()在這種情況下并不比任何其他可以節(jié)省你一些時(shí)間的函數(shù)更邪惡。

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
eval()
不是邪惡的?;蛘?,如果是這樣,那就像反射,文件/網(wǎng)絡(luò)I / O,線程和IPC在其他語言中是“邪惡的”一樣是邪惡的。
如果出于您的目的,eval()
比手動(dòng)解釋更快,或者使您的代碼更簡單或更清晰......那么您應(yīng)該使用它。如果不是,那么你不應(yīng)該。就那么簡單。

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
當(dāng)你信任來源時(shí)。
在JSON的情況下,它或多或少難以篡改源,因?yàn)樗鼇碜阅刂频腤eb服務(wù)器。只要JSON本身不包含用戶上傳的數(shù)據(jù),使用eval就沒有重大缺陷。
在所有其他情況下,我會(huì)竭盡全力確保用戶提供的數(shù)據(jù)符合我的規(guī)則,然后再將其提供給eval()。

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
讓我們真正的人:
現(xiàn)在每個(gè)主要的瀏覽器都有一個(gè)內(nèi)置的控制臺(tái),你可能會(huì)被黑客大量使用來調(diào)用任何有價(jià)值的函數(shù) - 為什么他們會(huì)費(fèi)心去使用eval語句 - 即使它們可以?
如果編譯2000行JavaScript需要0.2秒,如果我評(píng)估四行JSON,我的性能會(huì)下降嗎?
即使是克羅克福德對(duì)“eval is evil”的解釋也很薄弱。
eval是Evil,eval函數(shù)是JavaScript最被誤用的功能。躲開它
正如克羅克福德本人可能會(huì)說的那樣“這種說法往往會(huì)產(chǎn)生非理性的神經(jīng)癥。不要買它?!?/p>
了解eval并了解它何時(shí)可能有用更為重要。例如,eval是評(píng)估軟件生成的服務(wù)器響應(yīng)的合理工具。
BTW:Prototype.js直接調(diào)用eval五次(包括evalJSON()和evalResponse())。jQuery在parseJSON中使用它(通過Function構(gòu)造函數(shù))。
添加回答
舉報(bào)