【问题标题】:Accessing "pseudo-globals" by their name as a string通过名称作为字符串访问“伪全局变量”
【发布时间】:2010-05-04 19:52:23
【问题描述】:

我现在正在从我的代码中删除大多数全局变量,方法是将所有内容都包含在一个函数中,将全局变量转换为“伪全局变量”,这些变量都可以从该函数块内的任何位置访问。

(function(){

var g = 1;

var func f1 = function () { alert (g); }

var func f2= function () { f1(); }

})();

(从技术上讲,这仅适用于我的“发布版本”,我将所有文件一起附加到一个文件中,并用上面的内容包围它们……我的开发版本通常每个 js 文件都有一个全局文件)

这一切都很好,除了一件事......有一个重要的地方我需要通过字符串名称访问其中一些“全局变量”。以前,我可以这样做:

 var name = "g";
 alert (window[name]);

和它做的一样

 alert(g);

现在——从块内部——我想在我的伪全局变量上做同样的事情。但我不能,因为它们不再是任何父对象(“窗口”)的成员,即使在范围内。

有什么方法可以通过字符串访问它们?

谢谢...

【问题讨论】:

    标签: javascript


    【解决方案1】:

    基本上没有,正如这个问题间接回答的那样:Javascript equivalent of Python's locals()?

    您唯一真正的选择是使用eval,这通常不是一个好主意,甚至不是安全的主意,如以下问题所述:Why is using the JavaScript eval function a bad idea?

    如果这些变量的字符串名称确实以安全的方式定义(例如,不是通过用户输入或其他方式),那么我建议只使用eval。请务必认真思考这一点,以及是否有更好的方法来做到这一点。

    【讨论】:

    • 啊,是的,评估。不知道为什么我没有想到这一点。但是,是的,我不认为我想去那里。 :)
    • 他有什么理由不能只命名他用来包装代码的函数,然后作为该对象的成员访问“全局”?这就是我在回答中的建议,我只是好奇是否有我遗漏的东西可以解释。
    • @MisterMister:这可能是一个很好的方法,这取决于他的代码的细节、它的结构、以及他需要通过字符串名称访问全局的确切原因,以及重构的程度为了使这种方法发挥作用,将需要。如果没有这些细节,我真的不确定什么是最好的,尽管您的回答总体上是一种合理的方法。
    • @Eli Courtwright 这就是我的想法,我只是好奇我是否缺少某些东西(这种情况经常发生:-p)。谢谢。
    • @MisterMister ....是的,不是我想要的。我可以创建一个对象并访问它(无论是函数名还是其他),但我希望能够访问使用简单的“var whatever”创建的变量。这是一种特殊目的的需求……对于在开发/调试模式下与生产模式下工作方式不同的东西……在一种情况下,它们将是全局变量,在其他情况下,它们将受到“保护”。我可以解决无法以我喜欢的方式做到这一点的问题,但我想我会先检查一下。
    【解决方案2】:

    您可以命名您正在使用的函数来包装整个代码。

    然后将“全局”变量设置为该函数的成员(记住函数是 JavaScript 中的对象)。

    然后,您可以像以前一样访问该变量......只需使用函数的名称而不是“窗口”。

    看起来像这样:

    var myApp = new (function myApp(){
    
       this.g = "world";
    
       //in the same scope
       alert ( "Hello " + this["g"]);
    
    })();
    
    //outside
    alert ( "Hello " + myApp["g"]);
    

    【讨论】:

      【解决方案3】:

      如果你想在全局范围内访问某些东西,你必须把一些东西放在那里。在你的情况下,它可能是一个引用你关闭函数的对象。

      var obj1 = new (function(){
      
      var g = 1;
      
      var func f1 = function () { alert (g); }
      
      var func f2= function () { f1(); }
      
      })();
      

      您可以添加一个方法或属性作为g 的getter。如果g 的值不是恒定的,你可能会这样做

      this.getG = function() { return g; };
      

      您可以从那里按名称访问项目,例如

      alert( obj1["getG"]() );
      alert( window["obj1"]["getG"]() );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 2023-01-09
        相关资源
        最近更新 更多