为了账号安全,请及时绑定邮箱和手机立即绑定

使用eval将字符串转换为函数是邪恶的吗?

使用eval将字符串转换为函数是邪恶的吗?

回首忆惘然 2019-10-22 22:37:44
我听过很多关于eval()的不同意见,并且不确定在这种情况下是否可以使用eval():假设我有一个这样的对象:var bla = {blubb: function (callback) {       //GET some stuff via ajax       //call the callback    }}和这样的字符串: var someString = "bla.blubb";评估字符串以调用函数(和回调)是否有害?var callMe = eval(someString)callMe(function(){   alert('yay')!});
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

我在eval()上听到了很多不同的看法


eval 一般而言,它不是邪恶的,有它的应用。


不确定是否可以在这种情况下使用eval()


不,这不行。使用简单的括号符号成员运算符有更好的解决方案。由于每天都这样询问,因此我可以在此处列出数百个重复项(仅是Google的前几个结果):


以点表示法转换字符串以获取对象引用

将javascript点表示法对象转换为嵌套对象

使用字符串键访问嵌套的JavaScript对象

通过点语法字符串路径访问对象

将点表示法的JavaScript字符串转换为对象引用

使用点符号字符串访问对象的子属性

通过Javascript中的keyPath访问属性?


查看完整回答
反对 回复 2019-10-22
?
holdtom

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);

一种改进是修复根对象(而不是窗口),以避免任何类型的调用。


查看完整回答
反对 回复 2019-10-22
  • 3 回答
  • 0 关注
  • 501 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信