3 回答
TA贡献1829条经验 获得超7个赞
我在eval()上听到了很多不同的看法
eval 一般而言,它不是邪恶的,有它的应用。
不确定是否可以在这种情况下使用eval()
不,这不行。使用简单的括号符号成员运算符有更好的解决方案。由于每天都这样询问,因此我可以在此处列出数百个重复项(仅是Google的前几个结果):
以点表示法转换字符串以获取对象引用
将javascript点表示法对象转换为嵌套对象
使用字符串键访问嵌套的JavaScript对象
通过点语法字符串路径访问对象
将点表示法的JavaScript字符串转换为对象引用
使用点符号字符串访问对象的子属性
通过Javascript中的keyPath访问属性?
TA贡献1805条经验 获得超10个赞
让我们假设您的整个设计并非完全邪恶(只是一点点)。
那将意味着您限制并指定您所拥有的someString。例如,它可能是您可以调用的对象及其函数的路径,而无需任何参数(这使其危险性大大降低),并且在上下文中是全局对象。
然后,很容易解析字符串并在不使用的情况下调用函数eval。这样会更安全。例如 :
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);
一种改进是修复根对象(而不是窗口),以避免任何类型的调用。
添加回答
举报