Javascript 规避评估

Javascript 规避评估,javascript,eval,Javascript,Eval,我在表中列出了代码,我想访问某个单元格中的代码并运行它。问题是表中的所有值都是字符串,我无法将字符串转换为代码 function readTable(tableName, rowId, columnName) { readRecords(tableName, {}, function(records) { for (var i =0; i < records.length; i++) { var record = records[i]; if (record.i

我在表中列出了代码,我想访问某个单元格中的代码并运行它。问题是表中的所有值都是字符串,我无法将字符串转换为代码

function readTable(tableName, rowId, columnName) {
 readRecords(tableName, {}, function(records) {
   for (var i =0; i < records.length; i++) {
    var record = records[i];
      if (record.id === rowId) {
      if (record[columnName]!==undefined) {
          eval(record[columnName]);
      }
      }
   }
 }); 
}
它的运行方式是

setText("specialbutton","You got tricked. Be careful next time.");gameovercounter()

使用eval后。我还没有弄明白如何在这个例子中避免eval。

避免eval并仍然从文本运行代码的最佳方法是使用:

new Function(strFuncBody)
将您的评估代码替换为:

if (record[columnName]!==undefined) {
    // create a function to run
    var func = new Function(record[columnName]);
    // then call the function...
    func();
}
eval()和Function()之间有很大区别,本文中名为“永远不要使用eval!”的部分对此进行了解释:


无论如何,如果您不能完全控制字符串包含的内容,则不应使用new Function()或eval()将字符串作为代码运行。

是否必须将代码存储在表中?请澄清,这是一个html表?如果是这样,请不要在DOM中保存文本JS代码,使用与函数对应的事件名称,这样读取字符串和调用相应函数就不会相互耦合。是否可以将命令和参数存储在表中?像
setText,“string1”,“string2”
?如果你被迫使用这样的设置,那么eval是你最好的工具。如果你有某种类似于JS的DSL,那么也许你可以使用解析器库,得到表达式树,并基于它创建JS代码<代码>评估如果使用时未试图从管柱上去除潜在的危险部分,则是危险的。那么,你能描述一下字符串中允许的代码语法吗?“无论如何,如果你不能完全控制字符串包含的内容,你就不应该将字符串作为代码运行。”对不起。我应该清楚地表明,我完全可以控制字符串本身,并且只使用表来存储它们。该表未由用户输入填写。无论如何,回答得不错。
if (record[columnName]!==undefined) {
    // create a function to run
    var func = new Function(record[columnName]);
    // then call the function...
    func();
}