3 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
我在eval()上聽到了很多不同的看法
eval 一般而言,它不是邪惡的,有它的應(yīng)用。
不確定是否可以在這種情況下使用eval()
不,這不行。使用簡單的括號(hào)符號(hào)成員運(yùn)算符有更好的解決方案。由于每天都這樣詢問,因此我可以在此處列出數(shù)百個(gè)重復(fù)項(xiàng)(僅是Google的前幾個(gè)結(jié)果):
以點(diǎn)表示法轉(zhuǎn)換字符串以獲取對(duì)象引用
將javascript點(diǎn)表示法對(duì)象轉(zhuǎn)換為嵌套對(duì)象
使用字符串鍵訪問嵌套的JavaScript對(duì)象
通過點(diǎn)語法字符串路徑訪問對(duì)象
將點(diǎn)表示法的JavaScript字符串轉(zhuǎn)換為對(duì)象引用
使用點(diǎn)符號(hào)字符串訪問對(duì)象的子屬性
通過Javascript中的keyPath訪問屬性?

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
讓我們假設(shè)您的整個(gè)設(shè)計(jì)并非完全邪惡(只是一點(diǎn)點(diǎn))。
那將意味著您限制并指定您所擁有的someString。例如,它可能是您可以調(diào)用的對(duì)象及其函數(shù)的路徑,而無需任何參數(shù)(這使其危險(xiǎn)性大大降低),并且在上下文中是全局對(duì)象。
然后,很容易解析字符串并在不使用的情況下調(diào)用函數(shù)eval。這樣會(huì)更安全。例如 :
window.a = {b:{c:function(){console.log('here')}}};
var someString = "a.b.c";
var path = someString.split('.');
var f = window;
for (var i=0; i<path.length; i++) f = f[path[i]];
f.call(null);
一種改進(jìn)是修復(fù)根對(duì)象(而不是窗口),以避免任何類型的調(diào)用。
添加回答
舉報(bào)