以名称作为字符串访问“伪全局变量”

时间:2010-05-04 19:52:23

标签: javascript

我现在正在通过将所有内容包含在函数中来将大部分全局变量从函数中移除,将全局变量转换为“伪全局变量”,这些全局变量都可以从该功能块内的任何位置访问。

(function(){

var g = 1;

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

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

})();

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

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

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

它和

一样
 alert(g);

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

用字符串访问它们的方法吗?

...谢谢

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

它看起来像这样:

var myApp = new (function myApp(){

   this.g = "world";

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

})();

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

答案 2 :(得分:0)

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

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