JavaScript 中 eval 的预期目的是啥? [复制]

Posted

技术标签:

【中文标题】JavaScript 中 eval 的预期目的是啥? [复制]【英文标题】:What is the intended purpose of eval in JavaScript? [duplicate]JavaScript 中 eval 的预期目的是什么? [复制] 【发布时间】:2010-12-08 07:38:45 【问题描述】:

可能重复:When is javascript’s eval() not evil?

我知道,通常使用eval() 是不好的做法。

但它存在的目的是什么?

eval() 的正确用途是什么?

在什么情况下使用eval()比较好?

【问题讨论】:

en.wikipedia.org/wiki/Eval#JavaScript 只是拼错了evil()。不要使用它。 rollseyes eval 不一定是邪恶的,这完全取决于你打算用它做什么,有时真的没有其他办法。 ***.com/questions/197769/… @Andy E. 感谢您的指出。 【参考方案1】:

我最近在尝试使用 eval() 命令,同时尝试为新项目提出新约定。

我想要的是:我喜欢拥有 privatepublicprivileged 方法的想法,唉。 Doug Crockford's article,但我希望能够在我的类的顶部而不是像往常那样在底部公开公共方法/变量。

考虑一下:

var Singleton = function() 
    // Private
    function _one() 
        // code...
    

    function _two() 
        // code...
    

    // Public
    return 
        one: _one,
        two: _two
    ;
();

通过三个eval()(两个嵌套在主要的内部)我能够拥有这样的语法:

var Singleton = function() 
    // Public
    var $interface = 
        one: $forward,
        two: $forward
    ;

    // Private
    function _one() 
        // code...
    

    function _two() 
        // code...
    

    // This does the magic
    return eval($init);
('Singleton');

而且它确实奏效了。 (请注意,我还想要一种调试命名空间的方法,这就是为什么您可以看到传递给单例的字符串。$init 也处理了这个问题。)

无论如何,我想输入所有这些内容的意义在于,eval() 不一定是 JavaScript 垃圾的病态残缺,应该不惜一切代价避免,并且可以以更多方式使用,而不仅仅是 (可信!)从服务器发送的代码和 JSON 反序列化。

(尽管在我的情况下,它最终成为了一种心理锻炼,因为我已经说服自己毕竟不要打扰私有方法/变量,而只是使用严格的命名空间约定。)

【讨论】:

【参考方案2】:

我认为将其用作危险并没有那么糟糕。人们说不要使用eval,因为它会为滥用打开漏洞。如果您的输入是安全的,则可以使用它。它用于Doug Crockford's JSON parser,例如,在使用正则表达式检查输入以确保没有“危险”内容之后。

人们告诉你不要使用它的另一个原因是,如果你使用 eval 过多,人们会开始称你为 Eval Knievel。

【讨论】:

【参考方案3】:

eval

计算一串 JavaScript 代码 不参考特定的 对象。

如果将算术表达式构造为字符串,则可以在以后使用 eval 对其进行计算。例如,假设您有一个变量 x。您可以通过将表达式的字符串值(例如“3 * x + 2”)分配给变量,然后在脚本中稍后调用 eval 来推迟对涉及 x 的表达式的求值。

使用 eval 时要小心

eval() 是一个危险的函数,它以调用者的权限执行它传递的代码。如果您使用可能受到恶意方影响的字符串运行 eval(),您最终可能会在具有您网页/扩展程序权限的用户计算机上运行恶意代码。

【讨论】:

+1 这个答案对我来说似乎没问题,所以我投了赞成票。投反对票的人应该解释原因。 是否反对“不要使用 eval”? 我不知道,但对答案有一个奇怪的反对意见。现在好像没了。 我没有投反对票,但我认为选民可能不喜欢不必要地强调不使用 eval。 ***.com/questions/197769/… 我不喜欢“不要使用 eval!”这样的绝对。 eval 是一个工具。当您需要该特定工具时使用它,不要在其他时间使用它。诀窍是了解“需要”的正确定义。【参考方案4】:

eval() 提供对 JavaScript 编译器的访问,这最终允许稍后执行代码。传递给函数的参数将传递给 JavaScript 编译器,然后执行代码。

开发人员争论eval() 的安全性。它不太安全,但如果你绝对确定你的输入在传递之前已经过净化,那么它应该不是问题。

另外,eval() 的结果通常较慢,因为代码尚未编译或缓存。使用该函数显然会对性能造成影响。

调试使用eval() 产生的代码也很困难,因为关于最终执行的代码几乎没有上下文信息(想想行号)。

在 Web 开发方面,eval() 目前最流行的用途之一是在 Ajax 应用程序的上下文中通常反序列化 JSON 字符串;但是,这并不是说没有很多其他用途。

【讨论】:

我最喜欢这个答案 - 没有废话,只是一个聪明的书面答案:)【参考方案5】:

您可能想查看this article,下面是该页面的直接引用,它总结了 eval 的力量。

JavaScript EVAL 命令可以是 使用动态时非常强大 基于 Web 的应用程序中的内容。 EVAL 可以减少代码并简化 与未知数据的交互 在加载时,但有缺点 考虑到。

这个命令的真正威力在于它 处理数据的能力 在加载时已知——例如, 用户输入的数据。正如我所拥有的 提到,EVAL 接受任何字符串 您提供并执行它返回 结果,如果适用的话。你 可以使用它来执行 JavaScript 你被问到的地方 在加载时执行是未知的。为了 例如,如果我们有一个计算 采用提供的等式的脚本 由用户返回结果,你 可以使用 EVAL 来执行 计算。

【讨论】:

这是eval,而不是EVAL 哦,真的吗?!这是一个报价。将您的投诉发送给作者。 我知道这是一个引用,但您选择在回答中引用它。我敢肯定,在这个问题的上下文中,没有人真的会对大写感到困惑,但是用函数名称区分大小写的语言来表示函数名称是一种奇怪的方式。

以上是关于JavaScript 中 eval 的预期目的是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

AMD:javascript上下文的目的是啥?

将整个 Javascript 文件包装在像“(function() ... )()”这样的匿名函数中的目的是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?

在 JavaScript 中深度克隆对象的最有效方法是啥?