Javascript 访问;“伪全局”;以字符串形式显示它们的名称

Javascript 访问;“伪全局”;以字符串形式显示它们的名称,javascript,Javascript,我现在正在从代码中删除大多数全局变量,方法是将所有变量封装在一个函数中,将全局变量转换为“伪全局变量”,所有这些变量都可以从该函数块内的任何位置访问 (function(){ var g = 1; var func f1 = function () { alert (g); } var func f2= function () { f1(); } })(); (从技术上讲,这只适用于我的“发布版本”,我将所有文件附加到一个文件中,并用上面的内容将它们包围起来……我的开发版本通常每个js

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

(function(){

var g = 1;

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

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

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

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

 var name = "g";
 alert (window[name]);
它的作用和

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

有没有办法通过字符串访问它们


谢谢……

基本上没有,正如这个问题间接回答的那样:

您唯一的实际选择是使用,这通常不是一个好的甚至不安全的想法,如本问题所述:


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

如果您想在全球范围内访问某些内容,您必须在其中添加一些内容。在您的例子中,它可能是引用关闭函数的对象

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"]() );

您可以命名用于包装整个代码的函数

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

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

它看起来像这样:

var myApp = new (function myApp(){

   this.g = "world";

   //in the same scope
   alert ( "Hello " + this["g"]);

})();

//outside
alert ( "Hello " + myApp["g"]);

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