【问题标题】:Should I use eval inside javascript?我应该在 javascript 中使用 eval 吗?
【发布时间】:2014-09-17 21:29:41
【问题描述】:

我的问题是我有一个很长的字符串要解析(基本上是一个表示为字符串的对象),我试图在不使用 eval 的情况下手动解析它,我有超过 1000 行循环函数,我'甚至还没有接近完成算法。

我正在检查这是如何在 jQuery.metadata 中完成的,他们只是使用了 eval!我的 1000 行代码可以缩减为一个 eval,但这安全吗?我听说这个函数既不安全也不快,但考虑到所有这些循环和解析,我的算法也很慢。

例如

<button onajax="{reload:'#someitem',callback: function('somedata'),items:{1,2,3}}">

我需要设置

var onajaxargs = {reload:'#someitem',callback: function('somedata'),items:{1,2,3}};

【问题讨论】:

  • 如果该对象表示为 JSON 字符串,您最好使用JSON.parse()
  • @Roman Hocke :它会解析诸如“{action : doSomething('some data')}”之类的字符串吗,对不起,我不太习惯 JSON
  • 不,不会。所以你的字符串不是 JSON,很高兴知道。只是为了好奇:那个字符串是从哪里来的?
  • 我正在尝试创建一个库作为 jQuery 的扩展,尽可能避免编写脚本,所以基本上一些属性为 onajax="{reload:'data',callback:myfunc('func ')}" 可以完成这项工作,这显然是一个对象,根据 jQuery.metadata 我应该使用 eval,但我还不确定。

标签: javascript performance eval


【解决方案1】:

如果你能提供更多关于你正在尝试做什么的信息,那么我可以更好地回答你的问题,但就像 Roman 所说,JSON 似乎是解析字符串的最佳方法。

这解释了如何很好地使用 JSON.parse(): Parse JSON in JavaScript?

【讨论】:

    【解决方案2】:

    如果您还没有,请参阅Why is using the JavaScript eval function a bad idea?

    我建议使用这种首先对 JSON 进行编码的方法,然后“恢复”您的函数成员。 http://ovaraksin.blogspot.com/2013/10/pass-javascript-function-via-json.html

    jsonText='{"reload":"#someitem","callback": "function(somedata) {alert(somedata)}","items":[1,2,3]}';
    
    var jsonTransformed = JSON.parse(jsonText, function (key, value) {
            if (value && (typeof value === 'string') && value.indexOf("function") === 0) {
                // we can only pass a function as string in JSON ==> doing a real function
                var jsFunc = new Function('return ' + value)();
                return jsFunc;
            }
    
            return value;
    });
    

    几个观察:

    1. 您需要有一个规范的 JSON 以确保其正常工作 - 所有字符串和成员名称都用双引号引起来。
    2. 您需要对字符串中的引号(单引号和双引号)进行适当的转义。
    3. 您需要使函数成员在字符串的开头包含文本“function”。
    4. 数组成员用方括号括起来,而不是像您原来的帖子那样用花括号括起来。

    【讨论】:

    • 很抱歉,但它不能满足我的需要,我尝试了一种混合方式,我创建了一些规​​则和一个小解析器,即使这样,当异常发生时,也会创建一个函数,就像var jsFunc = new Function('return ' + value)() 得到它的值,和eval很像。
    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2010-10-06
    • 2010-10-12
    • 2021-10-20
    • 2012-03-18
    • 2021-02-07
    • 2011-03-19
    相关资源
    最近更新 更多