Javascript:通过名称访问闭包中的局部变量或变量

时间:2010-02-25 18:19:40

标签: javascript function variables local closures

  

可能重复:
  How can I access local scope dynamically in 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();

5 个答案:

答案 0 :(得分:13)

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

如果您真的需要通过字符串访问,我建议将所有变量保存在对象中:

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

更新:有点不好意思,没有办法像你想要的那样做。在内部,变量是声明性环境记录中的可变绑定。属性通过对象的环境记录绑定到它们是属性的对象,但实际上有一种方法可以使用括号来访问它们。不幸的是,没有办法以相同的方式访问声明性环境记录。

答案 1 :(得分:7)

使用窗口或任何其他全局访问器访问变量将不起作用,因为该变量不可全局访问。但您可以使用eval来评估任何表达式:

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

test();
</script>

答案 2 :(得分:2)

不,因为只能从包含变量范围的执行上下文中访问该变量。

换句话说,唯一可以访问j的方法是,如果您从test范围内的某些内容访问它 - 通过内部函数或其他方式。这是因为j在某种意义上对于具有更宽范围的对象(如全局对象)不存在。如果不是这样,那么变量名称必须全局唯一。

答案 3 :(得分: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>

答案 4 :(得分:2)

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