代码之家  ›  专栏  ›  技术社区  ›  Ben Clayton

javascript:通过其名称访问闭包中的局部变量或变量[重复]

  •  14
  • Ben Clayton  · 技术社区  · 15 年前

    可能重复:
    How can I access local scope dynamically in javascript?

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

    对于局部变量也可以这样做吗?另一个答案 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 回复  |  直到 9 年前
        1
  •  13
  •   Bob    15 年前

    我不知道javascript中内置了什么可以引用这样的局部变量(尽管可能应该考虑到所有变量都是由字符串内部引用的)。

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

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

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

        2
  •  7
  •   PanJanek    15 年前

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

    <script>
    function test(){
       var j = 1; 
       alert(eval("j"));
    }
    
    test();
    </script>
    
        3
  •  2
  •   Mic    15 年前

    如何:

    <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
  •   Tim Down    15 年前

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

        5
  •  2
  •   ntownsend    15 年前

    否,因为只能从包含变量作用域的执行上下文中访问该变量。

    换一种方式,你唯一可以进入的方式 j 如果您是从 test --通过一个内在的功能,或者其他什么。这是因为 J 在某种意义上,对于范围更广的对象,例如全局对象,不存在。否则,变量名必须全局唯一。