15

可能重复:
如何在 javascript 中动态访问本地范围?

大家好。
我们都知道,您可以使用 [] 语法通过名称访问 javascript 对象的属性。例如 ob['nameOfProperty']。

你可以对局部变量做同样的事情吗?这里的另一个答案建议答案是使用 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();
4

5 回答 5

15

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

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

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

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

于 2010-02-25T18:51:55.117 回答
8

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

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

test();
</script>
于 2010-02-25T18:39:24.457 回答
2

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

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

于 2010-02-25T18:42:40.330 回答
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>
于 2010-02-25T18:59:48.187 回答
2

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

于 2010-02-25T19:28:35.647 回答