2010-02-25 46 views
14

可能重复:
How can I access local scope dynamically in javascript?的Javascript:其名称可以访问在封闭的局部变量或变量

大家好。
我们都知道你可以使用[]语法通过它的名称访问JavaScript对象的属性。 OB [ 'nameOfProperty']。

你可以做同样的局部变量吗?另一个回答here建议答案是使用window ['nameOfVar']。但是,这只适用于海报,因为他是在窗口范围内定义变量的。

我认为这一定是可能的,因为Firefox的Firebug(我相信是用javascript编写的)可以显示局部变量和闭包变量。有没有我不知道的一些隐藏的语言功能?

具体而言,这里就是我想要做的:

var i = 4; 
console.log(window['i']); // this works.. 

function Func(){ 
    var j = 99; 

    // try to output the value of j from its name as a string 
    console.log(window['j']); // unsurprisingly, this doesn't work 
} 

Func(); 
+1

请参阅http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript – 2010-02-25 19:16:29

+0

你也可以看看http://stackoverflow.com/questions/ 1119335/javascript-local-variable-declare http:// stackoverflow。com/questions/598878/how-can-i-access-local-scope-dynamic-in-javascript – 2010-02-25 18:42:19

回答

13

我不知道任何内置JavaScript的引用这样的局部变量(尽管可能应该考虑所有变量都由内部引用的字符串)。

我建议保持所有变量中的对象,如果你真的需要访问的字符串:一种程序错误的我,有没有办法像你想这样做:

var variables = { 
    "j": 1 
}; 
alert(variables["j"]); 

更新。变量的内部是声明性环境记录中的可变绑定。属性通过对象的环境记录绑定到它们属于的对象,但实际上有一种方法可以使用括号来访问它们。不幸的是,没有办法以相同的方式访问声明性环境记录。

+0

鲍勃,也让我感到害怕。事实上,EcmaScript理论上支持这一点,但实现(JavaScript)不支持。 – 2013-04-30 16:11:57

7

访问与窗口或其他任何全球访问的变量将不能工作,因为变量不是全局访问。但是你可以使用可以使用eval来评估任何表情:

<script> 
function test(){ 
    var j = 1; 
    alert(eval("j")); 
} 

test(); 
</script> 
+0

感谢潘。我想我应该更清楚的问题,并说没有使用eval。 :-)看起来像这是做我想要的而不修改模式的唯一方法。 – 2010-02-26 10:30:01

2

没有,因为变量是包含变量的作用域的执行上下文中才能访问。

换句话说,您可以访问j的唯一方法是,如果您通过test范围内的内容访问它 - 通过内部函数或其他任何方式访问它。这是因为在某种意义上,j不存在于范围更广的对象,比如全局对象。否则,变量名称将不得不全球唯一。

2

什么:

<script> 
    function Func(){ 
     var fn = arguments.callee; 
     fn.j = 99; 
     console.log(fn['j']); 
    } 
    Func(); 
    console.log(window['j']); //not global 
    console.log(Func['j']); //but not private 
</script> 
+0

由于Func不是一个对象,它指向全局对象。你实质上是在说窗口['j'] – Bob 2010-02-25 19:10:06

+0

@Bob,你是否在尝试之前先试用它?因为它有效。 – Mic 2010-02-25 19:21:33

+0

@Bob,好吧,我明白了,你是对的 – Mic 2010-02-25 19:25:46

2

没有,这是不可能的一般。 JavaScript使用范围链解析函数内的标识符;没有单个对象包含范围内的所有变量,并且范围链中的对象无法从页面中运行的JavaScript访问。