【问题标题】:What uses of eval() (or the indirect eval/execScrtipt()) are legitimate? [duplicate]eval()(或间接的 eval/execScript())的哪些用途是合法的? [复制]
【发布时间】:2011-11-28 19:19:16
【问题描述】:

我从来没有遇到过需要eval()的情况。

人们经常说[] 属性访问器使eval() 变得多余。

实际上,痛苦语句的执行与将其作为参数推入eval() 函数不完全相同。它的实际用途是什么?

您能否举例说明何时使用 eval() 可能有用?

【问题讨论】:

标签: javascript


【解决方案1】:

我不知道这有多糟糕,但我用它在动态加载的 HTML 模板中运行脚本,因为它们不会自动运行。

evaluateScripts = function(container) {
    var scripts, i;
    scripts = container.querySelectorAll("script[type='application/javascript']");
    for (i = 0; i < scripts.length; i++) {
        eval(scripts[i].innerHTML);
    }
}

【讨论】:

    【解决方案2】:

    我不知道合法的,但这就是 jquery 使用 eval 的方式-

    globalEval: function( data ) {
        if ( data && rnotwhite.test( data ) ) {
            // We use execScript on Internet Explorer
            // We use an anonymous function so that context is window
            // rather than jQuery in Firefox
            ( window.execScript || function( data ) {
                window[ "eval" ].call( window, data );
            } )( data );
        }
    },
    

    【讨论】:

      【解决方案3】:

      使用你最喜欢的 Javascript 库和 grep 来使用 eval。希望您的库是由知识渊博的人制作的,并且 eval 的唯一案例是您正在寻找的那种好例子。

      我查看了 Dojo 工具包,其中一个 eval 位于模块加载器中(它显然有一种模式,对丢失的模块执行 AJAX 请求,并且 eval 执行代码而不是创建脚本标记)。

      【讨论】:

        【解决方案4】:

        eval 是表达式求值器和语句执行器之间的混合体。它返回最后一个表达式求值的结果(所有语句都是 Javascript 中的表达式),并允许省略最后的分号。

        作为表达式评估器的示例:

        foo = 2;
        alert(eval('foo + 2'));
        

        作为语句执行者的例子:

        foo = 2;
        eval('foo = foo + 2;alert(foo);');
        

        JavaScript eval 的一个用途是解析 JSON 文本,可能是 Ajax 框架的一部分。但是,现代浏览器提供JSON.parse 作为此任务的更安全替代方案。

        source

        考虑到这一点,我可以看到您想要使用 eval() 的唯一真正原因是执行用户输入。但这会导致严重的安全风险...所以简而言之,我会说 eval()(在 javascript至少)已成为静音功能;替换为过去会调用您使用eval() 的许多特定功能。

        另一个想法。 你可以用它来执行ajax返回的纯js

        您的服务器可以传回一个包含“alert('hello world');”的字符串你可以eval(returnData);

        【讨论】:

          【解决方案5】:

          我发现需要使用 eval 的最常见情况是当我得到一个想要用作对象的 json 字符串时。

          var obj = eval('('+jsonString+')');
          

          【讨论】:

          • 为什么不使用JSON.parse呢?
          • 在 JSON.parse 之前有一段时间......但现在没有理由进行 eval。
          • 呵呵,我在回答中确实提到了所有这些。 :P
          • 我不相信 json.parse 被 IE7 或更早版本支持。这仍然是相当数量的浏览器流量。
          • 括号只是一种预防措施,将其与代码中可能存在的其他对象/变量/函数分开,以避免混淆。 JSON 是一个表示 javascript 对象的字符串。如果您在 javascript 中的字符串中编写代码,它只会生成对象。这就是 eval 所做的。像运行 javascript 一样运行字符串。
          猜你喜欢
          • 1970-01-01
          • 2014-03-08
          • 2022-10-25
          • 2015-11-10
          • 2012-11-12
          • 2018-09-27
          • 1970-01-01
          • 1970-01-01
          • 2020-07-23
          相关资源
          最近更新 更多