javascript - 使用 eval() 设置全局变量

标签 javascript ajax eval

我使用 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.eval() 从全局范围运行 eval()。这会将 var 分配为 window 的变量,这就是全局变量:附加到 window 的变量。

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

除非您真的知道自己在做什么并且相信您通过 XMLHttpRequest 接收到的一切,否则不会发生这种情况。这是先有鸡还是先有蛋的事情:如果您足够信任代码来执行它,那么它的编程应该足够好,以便在全局变量前加上 window. 开头;因此,您不需要使用 window.eval()

此外,除非你只是想通过使用更易于管理的 XMLHttpRequest 来避免异步问题(凡事都有第一次......),你真的应该只创建一个脚本标签,分配它是源代码,并将其作为子项附加到 head 或 body 标签。动态附加脚本标签甚至比使用 XHR 更快,尤其是对于大脚本。

关于javascript - 使用 eval() 设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12167800/

相关文章:

javascript - 请求后是否可以在下一个代码行中获得 Ajax 响应?

jquery - WebAPI 实例化对象,即使它们在 JSON 中为 null

javascript jquery 和使用 eval

hadoop - sqoop eval 中文件的 SQL 评估参数

javascript - Node.js,厄运的金字塔(即使有异步),你能把它写得更好吗?

javascript - 使用 JavaScript 获取 <td >'s height and a <p>' s 字体大小

javascript - 如何防止在打开对话框时显示工具提示

javascript - 如何制作按钮/链接以在 &lt;iframe&gt; 而不是页面中显示源代码?

ajax - Grails 3.3.4简单的Ajax调用

bash - 如何在 bash 中组合超时和 eval 命令