2012-06-12 36 views
4

我遇到了代碼變量名彼此衝突的問題,即;在JavaScript中阻止「全局」引用

<script type="text/javascript">var a = "hello"; </script> 
<script type="text/javascript">alert(a);//this works, when I want 'a' not to exist </script> 

關閉是唯一的選擇嗎?

從C#背景的,它像構建未引用實例的委託,然後調用它內聯,這似乎有點亂

(function(){var a = "hello";})(); 
(function(){alert(a);})();//yes! working as expected 

回答

6

使用(立即自動執行)函數來創建一個新的作用域的確是要走的路。

這也有一個好處,就是可以確保某些變量具有某些值。當使用jQuery,下面例如常見:

(function($, window, undefined) { 
    // ... 
})(jQuery, this); 

除非你有隻在每一條語句噸的功能(如在你的例子),它也是完全可讀。

5

是,閉包是你唯一的選擇。在瀏覽器中,所有JavaScript文件都被放入同一個全局範圍。

IIFE's在JavaScript中常見的地方;我不會叫他們混亂。

0

簡而言之,內聯的東西,那麼你最好使用模塊模式來創建一個閉包,並因此模擬私有變量。

(function(){ 
    var a.... 
    })(); 

更好的長期方法是使用對象作爲名稱空間。

var NS = {}; 
NS.a = 1; 
2

的Javascript 具有功能範圍,不同於具有阻止範圍C#。以下代碼是有效的javascript和C#:

var x = 2; 
while(true) { 
    var y = 3; 
    break; 
} 
//y is not accessible here in C#, but is in javascript 

創建新範圍的唯一方法是創建並執行匿名函數。

0

只是爲了提供不同的視角。可以在不使用閉包的情況下編寫代碼,並且維護(可論證)安全的全局變量作用域。

  1. 定義單個對象,爲命名空間來使用,用適當唯一的名稱(如MyAppContext),將有全球範圍內,如果你需要定義全局變量一樣只爲您的應用程序只使用,將它們附加到這個對象。

    MyAppContext.appTitle ='Application Title';

  2. 在您創建的腳本開始MyAppContect確保它不存在。

  3. 確保所有的函數作用域變量都使用關鍵字var,因此您知道您沒有引用全局值。

很顯然,這種方法會導致您忘記用var定義一些函數變量的風險。 JSLint可以幫你反駁這個。

我很高興收回這個答案,如果我開始發火,但我相信這是一個可行的替代方法來使用閉包。嘿!這是舊的skool

我也同意使用閉包更安全,但認爲這可能會讓你感興趣。