2012-08-28 68 views
3

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

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

+1

为什么不使用'window.x = 1;'而不是? – zerkms

回答

3

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

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

<script type="text/javascript"> 

    $(function() { 

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

那时为什么要使用eval? – asawyer

+1

@asawyer我真的不在乎。我只是回答这个问题。这就是OP代码不起作用的原因 –

+0

@asawyer:这是自然代码混淆的常见方式。有些人使用一些特殊的混淆软件,另一种 - 只雇用坏的开发人员。 – zerkms

2

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

window['x'] = 1; 
+0

你甚至可以使用'window.x = 1;' – gdoron

+0

这个javascript是由服务器控件生成的;它超出了我的控制范围。 – tenfour

+2

那么你的问题是什么呢? – Blender

3

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

......但你真的不应该。由于某种原因,eval()被沙箱化。

这不是,除非你真的知道你在做什么,并相信你通过XMLHttpRequest收到的一切。它是这些鸡/蛋的事情之一:如果你相信代码足以执行它,它应该编程得足够好,以全局变量前缀window.开头;因此,您不需要使用window.eval()。另外,除非你只是想通过使用更易于管理的XMLHttpRequest(这是第一次......),你应该创建一个脚本标记,分配它的源代码,然后附加它作为孩子的头部或身体标签。动态附加脚本标记甚至比使用XHR更快,特别是对于大型脚本。