使用eval()设置全局变量

Using eval() to set global variables

本文关键字:设置 全局变量 eval 使用      更新时间:2023-09-26

我使用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,得到一个javascript错误,x是未定义的。如何使eval正确添加此变量?

背景:上面的代码是我正在进行的一个项目中的一个最低限度的复制示例,在这个项目中,我们必须在AJAX响应期间执行javascript代码。eval在大多数情况下都能正常工作,但这会造成问题。

您可以使用window.eval()从全局范围运行eval()。这将把var指定为window的一个变量,这就是全局变量的含义:一个附加到window的变量。

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

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

此外,除非您只是想通过使用更易于管理的XMLHttpRequest来避免异步问题(这是第一次…),否则您真的应该创建一个脚本标记,分配它的源,并将它作为子标记附加到head或body标记。动态附加脚本标记甚至比使用XHR更快,尤其是对于大型脚本。

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

要设置全局变量,请删除var

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

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

window['x'] = 1;