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

我听过很多关于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')!

});


回首忆惘然
浏览 503回答 3
3回答

千巷猫影

我在eval()上听到了很多不同的看法eval 一般而言,它不是邪恶的,有它的应用。不确定是否可以在这种情况下使用eval()不,这不行。使用简单的括号符号成员运算符有更好的解决方案。由于每天都这样询问,因此我可以在此处列出数百个重复项(仅是Google的前几个结果):以点表示法转换字符串以获取对象引用将javascript点表示法对象转换为嵌套对象使用字符串键访问嵌套的JavaScript对象通过点语法字符串路径访问对象将点表示法的JavaScript字符串转换为对象引用使用点符号字符串访问对象的子属性通过Javascript中的keyPath访问属性?

holdtom

让我们假设您的整个设计并非完全邪恶(只是一点点)。那将意味着您限制并指定您所拥有的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);一种改进是修复根对象(而不是窗口),以避免任何类型的调用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript