JavaScript中eval的预期用途是什么?

JavaScript中eval的预期用途是什么?,javascript,Javascript,可能重复: 我知道,通常使用eval()是不好的做法 但它存在的目的是什么 eval()的正确用途是什么 在什么情况下最好使用eval()?您可能需要检查,下面是本页的一段直接引语,总结了eval的功能 JavaScript EVAL命令可以是 使用dynamic时非常强大 基于Web的应用程序中的内容。 EVAL可以减少代码并简化 与未知数据的交互 在加载时,但也有缺点 考虑到 这个命令的真正力量是它的 能够处理不可用的数据 例如,在加载时已知, 用户输入的数据。像我一样 如上所述,EVAL

可能重复:

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

但它存在的目的是什么

eval()
的正确用途是什么

在什么情况下最好使用
eval()

您可能需要检查,下面是本页的一段直接引语,总结了eval的功能

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

这个命令的真正力量是它的 能够处理不可用的数据 例如,在加载时已知, 用户输入的数据。像我一样 如上所述,EVAL接受 您提供并执行它 如果适用,则为结果。你 您可以使用它来执行JavaScript 你被要求去哪里 加载时不知道执行。对于 例如,如果我们有一个计算 脚本,它接受提供的等式 并返回一个结果,则 可以使用EVAL执行以下操作: 计算


我不认为使用它有多危险。人们说不要使用
eval
,因为它会为滥用打开漏洞。如果您的输入是安全的,就可以使用它。例如,在使用正则表达式检查输入以确保没有“危险”内容后,将在中使用它

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

计算JavaScript代码字符串 没有提及某个特定的 反对

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

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

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

开发人员争论
eval()
的安全性。它不太安全,但如果您绝对确定输入在传递之前经过了消毒,那么就不会有问题

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

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


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

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

我想要的是:我喜欢有私有公共特权方法的想法,阿拉巴马州,但我希望能够在类的顶部公开公共方法/变量,而不是像往常一样在底部公开

考虑这一点:

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');
尽管有种种困难和常识,它确实起了作用。(请注意,我还需要一种调试名称空间的方法,这就是为什么您可以看到传递给singleton的字符串。
$init
也处理了这个问题。)

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


(虽然在我的例子中,它最终只是一种心理锻炼,因为我说服自己不要再为私有方法/变量操心,而只使用严格的名称空间约定。)

它只是拼写错误
evil()
。不要使用它。rollseyes eval不一定是邪恶的,这完全取决于你打算使用它做什么,有时真的没有其他方法了。@Andy E.谢谢你指出。+1这个答案对我来说似乎没问题,所以我投了更高的票。不管是谁投了反对票,都应该解释为什么。反对票是“不要使用eval”吗?我不知道,但在答案上有一个奇怪的反对票。现在它似乎已经消失了。我没有投反对票,但我想选民可能不喜欢不使用eval的不必要的强调。我不喜欢绝对的说法,比如“不要使用eval!”。评估是一种工具。当你需要特定的工具时使用它,其他时候不要使用它。诀窍是学习“需要”的正确定义。我最喜欢这个答案——没有BS,只是一个聪明的书面答案:)它是
eval
,而不是
eval
。哦,真的吗?!这是一句名言。将您的投诉发送给作者。我知道这是一个引用,但您选择在您的回答中引用它。我相信没有人会对这个问题中的大写感到困惑,但是用一种函数名区分大小写的语言来表示函数名是一种奇怪的方式。