2010-05-04 114 views
1

我现在正在通过在函数中包含所有内容,将全局变为“伪全局变量”从我的代码中删除大部分全局变量,这些变量都可以从任何地方访问在该功能块内。通过名称作为字符串访问“伪全局变量”

(function(){ 

var g = 1; 

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

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

})(); 

(从技术上讲,这是只为我的“发行版”,在这里我我的所有文件一起追加到一个单一的文件,并与上述包围他们....我的dev版本仍具有典型的每一个JS全球文件)

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

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

,它也做了同样的

alert(g); 

现在 - 从块内 - 我想这样做,我的伪全局。但我不能,因为它们不再是任何父对象(“窗口”)的成员,尽管它们在范围之内。

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

谢谢...

回答

1

基本上没有,因为这个问题间接回答:Javascript equivalent of Python's locals()?

你唯一的选择是使用eval,这通常不是一个好,甚至安全的理念,所描述的在这个问题中:Why is using the JavaScript eval function a bad idea?

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

+0

啊,是啊,EVAL。不知道为什么我没有想到这一点。但是,我认为我不想去那里。 :) – rob 2010-05-04 21:02:53

+1

是否有任何理由,他不能只是命名他用来包装代码的功能,然后作为该对象的成员访问“全局”? 这就是我在我的回答中所建议的,我只是好奇,如果有什么我错过了,你可以解释。 – MisterMister 2010-05-05 02:32:56

+0

@MisterMister:这很可能是一个很好的方法,这取决于他的代码,它是如何构造的细节,以及究竟为什么他需要通过一个字符串名称来访问一个全球性的,又有多少重构会为了让需要这种方法工作。没有这些细节,我真的不确定什么是最好的,尽管你的答案总的来说是一个合理的方法。 – 2010-05-05 03:16:54

0

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

var obj1 = new (function(){ 

var g = 1; 

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

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

})(); 

您可以为g添加方法或属性作为吸气剂。如果g值不是恒定的,你可能不喜欢

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

,你可以从那里通过名称来访问项目,如

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

可以命名功能,您使用的是包裹完整的代码。

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

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

这将是这个样子:

var myApp = new (function myApp(){ 

    this.g = "world"; 

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

})(); 

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