5

我使用设置全局变量的代码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大部分时间都可以正常工作,但这会导致问题。

4

3 回答 3

5

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

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

除非你真的知道你在做什么,并且相信你所接受的一切,否则那是不可能的XMLHttpRequest。这是鸡/蛋的事情之一:如果您足够信任代码来执行它,那么它应该被编程得足够好,以便在全局变量window.开头加上前缀;因此,您不需要使用window.eval().

Besides, unless you are just trying to avoid async headaches by using the more-manageable XMLHttpRequest (there's a first time for everything...), you really should just create a script tag, assign it's source, and append it as a child to the head or body tag. Dynamically appending script tags is even faster than using XHR, especially for big scripts.

于 2013-03-01T00:46:01.400 回答
3

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

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

<script type="text/javascript">

    $(function() {

        setTimeout(function() {
            eval('x = 1;');
            alert(x);
        }, 0);
    });
</script>
于 2012-08-28T21:32:34.063 回答
2

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

window['x'] = 1;
于 2012-08-28T21:32:47.413 回答