规避评估

时间:2017-04-27 12:16:00

标签: 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.id === rowId) {
      if (record[columnName]!==undefined) {
          eval(record[columnName]);
      }
      }
   }
 }); 
}

有没有办法绕过使用eval?例如,我的一个表格单元格中的文本被解释为(在保存表格之后)

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

并以

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

使用eval后。在这种情况下,我还没有想出如何避免使用eval。

1 个答案:

答案 0 :(得分:1)

避免使用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!”的部分中进行了解释:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval

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