2010-05-04 113 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"]);