2010-06-16 42 views
2

在下面的場景中,如果我不知道它們的名稱,如何獲得對eval()期間聲明的變量的引用?在JavaScript中獲取對eval()期間創建的局部變量的引用

function test() { 
    eval("var myVariable = 5"); 
    var locals = magic() // TODO What should we do here? 
    alert(locals["myVariable"]); // returns myVariable 
} 

請注意:正在評估的JavaScript來自可信來源。

+0

你有什麼影響你傳遞什麼樣的代碼爲'能力的eval()'樣子?換句話說,你是否可以改變這些代碼來完成這項工作,或者你是否使用來自另一個源代碼的代碼,而且你不能改變它? – Pointy 2010-06-16 14:34:21

+0

我可以改變代碼;你有什麼建議? – dpq 2010-06-16 14:37:16

+1

那麼,如果你可以明確地聲明一個具有可預測名稱的對象,然後將其他(不可預知的)屬性放在該對象中(請參閱@tomalak的答案),那麼你可以使用它。但是'eval()'不會創建一個新的作用域,並且據我所知,無法以一種可以讓它像對象一樣對待它的方式獲得對本地「關閉」作用域的引用。 – Pointy 2010-06-16 14:41:01

回答

2

的eval()在同一範圍內的調用者運行,因此這將工作:

function test() { 
    eval("var myVariable = 5"); 
    var locals = {}; 
    locals.myVariable = myVariable; // TODO What should we do here? 
    alert(locals["myVariable"]); // returns myVariable 
} 

但你不能確定在eval()函數調用中聲明哪些變量(如果這就是你想要的)

1
function test() { 
    eval("var locals = {myVariable: 5};"); 
    alert(locals["myVariable"]); 
} 

適合我。 eval()不會創建新的範圍。

+0

我已經澄清了這個問題,指出我不知道這些變量的名稱。 – dpq 2010-06-16 14:35:32

1

就這麼簡單:

eval("var myVariable = 5"); 
//no magic is needed 
alert(myVariable); // returns myVariable 
+1

如果我不知道變量的名字怎麼辦?即我需要先找出他們的名字。 – dpq 2010-06-16 14:36:39

相關問題