使用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
大部分时间都能正常工作,但这会导致问题。
答案 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;