2012-08-28 105 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更快,特別是對於大型腳本。