使用eval()设置全局变量

时间:2012-08-28 21:30:05

标签: 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大部分时间都能正常工作,但这会导致问题。

3 个答案:

答案 0 :(得分:5)

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

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

除非你真的知道自己在做什么,并且相信你通过XMLHttpRequest收到的所有内容,否则不会这样。它是那些鸡/蛋之一:如果你相信代码足以执行它,它应该编程得足够好,以window.开头的全局变量作为开头;因此,您不需要使用window.eval()

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

答案 1 :(得分:3)

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

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

<script type="text/javascript">

    $(function() {

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

答案 2 :(得分:2)

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

window['x'] = 1;