`

JavaScript Garden - 为什么不要使用 eval

阅读更多

为什么不要使用 eval

eval 函数会在当前作用域中执行一段 JavaScript 代码字符串。

var foo = 1;
function test() {
    var foo = 2;
    eval('foo = 3');
    return foo;
}
test(); // 3
foo; // 1

但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行。

var foo = 1;
function test() {
    var foo = 2;
    var bar = eval;
    bar('foo = 3');
    return foo;
}
test(); // 2
foo; // 3

译者注上面的代码等价于在全局作用域中调用 eval,和下面两种写法效果一样:

// 写法一:直接调用全局作用域下的 foo 变量
var foo = 1;
function test() {
    var foo = 2;
    window.foo = 3;
    return foo;
}
test(); // 2
foo; // 3

// 写法二:使用 call 函数修改 eval 执行的上下文为全局作用域
var foo = 1;
function test() {
    var foo = 2;
    eval.call(window, 'foo = 3');
    return foo;
}
test(); // 2
foo; // 3

任何情况下我们都应该避免使用 eval 函数。99.9% 使用 eval 的场景都有不使用 eval 的解决方案。

伪装的 eval

定时函数 setTimeout 和 setInterval 都可以接受字符串作为它们的第一个参数。
这个字符串总是在全局作用域中执行,因此 eval 在这种情况下没有被直接调用。

安全问题

eval 也存在安全问题,因为它会执行任意传给它的代码,
在代码字符串未知或者是来自一个不信任的源时,绝对不要使用 eval 函数。

结论

绝对不要使用 eval,任何使用它的代码都会在它的工作方式,性能和安全性方面受到质疑。
如果一些情况必须使用到 eval 才能正常工作,首先它的设计会受到质疑,这不应该是首选的解决方案,
一个更好的不使用 eval 的解决方案应该得到充分考虑并优先采用。

分享到:
评论

相关推荐

    ide-eval-resetter-2.3.5.zip

    ide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d.zipide-eval-resetter-2.3.5-c80a1d...

    SolarWinds-Orion-IPAM-v1-Eval

    "SolarWinds Orion IPAM v1-Eval"便是这样一款专为网络管理员设计的强大工具,它提供了智能IP地址管理(IPAM)功能,让网络监控和管理变得轻松高效。 Orion IPAM(IP地址管理)是太阳风Orion平台的一部分,它是一个...

    前端项目-expr-eval.zip

    在expr-eval项目中,`expr-eval-master`很可能是项目的主分支或者源代码目录。通常,这样的命名方式表明它是从某个版本控制系统(如Git)中克隆下来的。在该目录下,我们可以找到项目的核心代码、测试用例、文档和...

    ide-eval-resetter-2.3.5.jar,重新定义idea使用时间

    总的来说,`ide-eval-resetter`为开发者提供了一种方便的方式来延长IntelliJ IDEA的试用时间,但它涉及到版权和道德问题,不推荐在商业环境中使用。鼓励大家支持正版软件,通过合法途径获取和使用开发工具,以维护...

    Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO.zip

    Micrium_uCOS-III-STM32F107-Eval-Atollic-TrueSTUDIO.zip

    json------javascript eval()以及Example

    在处理JSON数据时,`eval()`曾被用来解析JSON字符串为JavaScript对象。例如,当你从服务器接收到一个JSON格式的字符串,你可以使用`eval()`将其转换为可操作的对象: ```javascript var jsonString = '{"name":...

    Faster R-CNN中voc_eval.py文件

    借助Faster R-CNN中voc_eval.py文件,测试YOLO测试数据集mAP等结果,博客见

    ide-eval-resetter-2.1.14.zip

    这个版本2.1.14的压缩包包含了一个名为 "ide-eval-resetter" 的核心程序,它主要用于解决开发者在使用试用版IDE时遇到的评估期限制问题。 IDE(集成开发环境)是程序员进行软件开发的重要工具,如JetBrains的...

    ide-eval-resetter-2.2.4.jar

    IDE软件试用30天:ide-eval-resetter-2.2.4.jar

    ide-eval-resetter-2.2.3-031813.zip

    IDE-Eval-Resetter 是一个专门针对IDE的评估期重置工具,通常用于开发者在试用期结束后继续使用软件。版本号"2.2.3-031813"表示这是该工具的第2.2.3次更新,发布日期可能是2013年3月18日。这个工具主要解决的是IDE...

    ide-eval-resetter

    如果在试用期结束后未购买正式许可证而继续使用,可能违反软件许可协议,因此在使用ide-eval-resetter时应确保遵循正确的授权规则。 ide-eval-resetter的工作原理可能涉及修改IDE的内部计时机制,清空或重置试用期...

    ide-eval-resetter-2.1.9.jar

    \ide-eval-resetter.zip\ide-eval-resetter\lib\ide-eval-resetter-2.1.9.jar

    ide-eval-resetter-2.1.13.zip

    使用方法: 1.首先将文件拷贝到任意的linux系统中 2.执行命令 sh ide-eval-resetter.sh 即可导出文件

    ide-eval-resetter-2.1.6

    在实际使用中,"ide-eval-resetter" 插件可能允许用户在IntelliJ IDEA的评估期结束后继续免费使用一段时间。通常,IDE的试用期结束后会限制某些功能或显示购买提示。该插件通过某种机制绕过这一限制,让开发者可以...

    idea插件-eval-resetter

    总的来说,"idea插件-eval-resetter"是开发人员在应对IDEA评估期限制时的一个实用工具,但使用时需谨慎,遵循软件使用规则。通过简单的操作步骤,它能够帮助开发者无缝地继续他们的工作流程,避免因试用期结束而中断...

    global-load-from-eval-in-with.rar_inside

    标题 "global-load-from-eval-in-with.rar_inside" 暗示了这个压缩包涉及的是一个JavaScript编程中的特定问题,特别是关于“eval”函数在“with”语句内部的行为。描述 "Tests global loads from eval inside of a ...

    ide-eval-resetter-2.1.14

    标题“ide-eval-resetter-2.1.14”暗示了这是一个针对IDE(集成开发环境)的评估重置插件,版本号为2.1.14。这类插件通常用于开发者在试用期间延长IDE的免费使用期限。IDEs如IntelliJ IDEA、Eclipse或Visual Studio ...

Global site tag (gtag.js) - Google Analytics