【问题标题】:Using eval() to set global variables使用 eval() 设置全局变量
【发布时间】:2013-03-01 08:53:03
【问题描述】:

我使用eval 设置全局变量的代码不起作用。就好像根本没有调用赋值,但没有发生脚本错误。

<script type="text/javascript">

    $(function() {

        setTimeout(function() {
            eval('var x = 1;');
            alert(x);
        }, 0);
    });
</script>

<div onclick="alert(x);">Click to see 'x'</div>

当页面加载时,警报会显示我的预期;它确认 x = 1。但在那之后,我单击 div 并得到一个 x 未定义的 JavaScript 错误。如何让eval 正确添加这个变量?

背景:上面的代码是我正在处理的一个项目中的最小复制示例,我们必须在 AJAX 响应期间执行 javascript 代码。 eval 大部分时间都能正常工作,但这会导致问题。

【问题讨论】:

  • 你为什么不改用window.x = 1;

标签: javascript ajax eval


【解决方案1】:

您可以使用window.eval() 在全局范围内运行eval()。这会将var 分配为window 的变量,这就是全局变量:附加到window 的变量。

...但你真的不应该。 eval() 被沙盒化是有原因的。

除非您真的知道自己在做什么并相信您通过XMLHttpRequest 收到的所有信息,否则情况并非如此。这是鸡/蛋的事情之一:如果你足够信任代码来执行它,它应该被编程得足够好,以window.开头的全局变量前缀;因此,您不需要使用window.eval()

此外,除非您只是想通过使用更易于管理的XMLHttpRequest 来避免异步头痛(所有事情都是第一次......),否则您真的应该只创建一个脚本标签,分配它的源,然后附加它作为一个孩子的头部或身体标签。动态附加脚本标签甚至比使用 XHR 更快,尤其是对于大型脚本。

【讨论】:

    【解决方案2】:

    Eval 在本地运行,您正在设置一个局部变量。

    要设置全局变量,删除var

    <script type="text/javascript">
    
        $(function() {
    
            setTimeout(function() {
                eval('x = 1;');
                alert(x);
            }, 0);
        });
    </script>
    

    【讨论】:

    • @asawyer 我不在乎。我只是在回答问题。这就是 OP 的代码不起作用的原因
    • @asawyer:这是一种常见的自然代码混淆方式。有些人使用一些特殊的混淆软件,另一种 - 只是雇用糟糕的开发人员。
    • 正如我在问题中所写,评估的代码是在 ajax 请求完成时运行的 javascript。该脚本由服务器生成。但这是正确的 - 问题是 javascript 错误,而不是 ajax 处理。我的 javascript 感觉还不够好,无法抓住这一点;谢谢。
    【解决方案3】:

    我不建议设置全局变量,但如果您绝对必须这样做,请使用window 对象:

    window['x'] = 1;
    

    【讨论】:

    • 那你的问题是什么?
    • @tenfour:然后向服务器控件的团队错误跟踪器提交错误
    • @Juan Mendes:“但这不是问题的重点”——总是告诉人们如何在 中做某事是有意义的正确的方法。只是盲目地回答 OP 想要什么从来都不是一个好策略。 OP 只有在您解释其好坏的原因时才能学到一些东西。
    • @Blender:这是“一旦我理解了解决方案,问题就变得荒谬”的情况。投票结束,因为过于本地化。
    • @JuanMendes:问题的重点是帮助 tenfour 解决问题,而不是用胶带覆盖它。我还没有看到服务器必须像这样设置 JavaScript 变量的任何情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多