2009-06-03 45 views
76

聲明一個全局變量,我需要,我需要的所有文件.js幾個全局變量。如何在.js文件

例如,請考慮以下4個文件:

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

有沒有我可以在聲明3個全局變量的方式global.js並在t中訪問它們他其他3 .js文件考慮我將所有上述4個文件加載到HTML文件?

是否有人可以告訴我,如果這是可能的,或者是有工作圍繞實現這一目標?

回答

84

在global.js只要定義的變量的函數範圍之外:

// global.js 
var global1 = "I'm a global!"; 
var global2 = "So am I!"; 

// other js-file 
function testGlobal() { 
    alert(global1); 
} 

要確保這個工程,你必須包括/鏈接到global.js您嘗試訪問該定義的任何變量之前文件:

<html> 
    <head> 
     <!-- Include global.js first --> 
     <script src="/YOUR_PATH/global.js" type="text/javascript"></script> 
     <!-- Now we can reference variables, objects, functions etc. 
      defined in global.js --> 
     <script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script> 
    </head> 
    [...] 
</html> 

,你可以,當然,在腳本的鏈接,如果你不希望的JS-文件負載中斷初始頁面加載標籤剛剛閉幕<體> - 標籤之前。

+4

雖然這個答案是正確的,我建議你谷歌的Javascript的變量範圍,以獲得更好的瞭解,並可能避免做這種具體的方式。 – aleemb 2009-06-03 12:16:05

+1

同意。我總是試圖將所有函數和變量放在一個共同的「命名空間」中,以避免混亂和衝突。通常我將它命名爲項目或公司的縮寫。 – PatrikAkerstrand 2009-06-03 12:40:17

6

你試過了嗎?

如果你這樣做:

var HI = 'Hello World'; 

global.js。然後做:

alert(HI); 

js1.js它會提醒它罰款。在HTML文檔的其餘部分之前,您只需包含global.js

,唯一的缺點是,你必須聲明它在窗口的範圍(內部沒有任何功能)。

你可以只尼克斯的var一部分,並創造他們的方式,但它不是好的做法。

2

是的,你可以訪問它們。您應聲明它們在「公共空間」(外的任何功能)爲:

var globalvar1 = 'value'; 

您可以訪問他們以後,也在其他文件。

78

推薦的方法是:

window.greeting = "Hello World!" 

然後,您可以任意函數內訪問:

function foo() { 

    alert(greeting); // Hello World! 
    alert(window["greeting"]); // Hello World! 
    alert(window.greeting); // Hello World! (recommended) 

} 

這是更可取的原因有兩個。

  1. 意圖是明確的。關鍵字var的使用很容易導致聲明全局爲vars,這意味着本地或反之亦然。對於很多Javascript開發人員來說,這種變量範圍是一個混亂點。因此,作爲一般規則,我確保所有變量聲明的前面都有關鍵字var或前綴window

  2. 您可以通過這種方式來標準化讀取變量的語法,這意味着本地範圍的var不會打破全局var,反之亦然。例如這裏所發生的曖昧:

 

greeting = "Aloha"; 

function foo() { 
    greeting = "Hello"; // overrides global! 
} 

function bar(greeting) { 
    alert(greeting); 
} 

foo(); 
bar("Howdy"); // does it alert "Hello" or "Howdy" ? 

然而,這是更清潔,更不容易出錯(你並不需要記住所有的變量範圍的規則):

function foo() { 
    window.greeting = "Hello"; 
} 

function bar(greeting) { 
    alert(greeting); 
} 

foo(); 
bar("Howdy"); // alerts "Howdy" 
3

如上所述,在腳本文件中使用最頂級的範圍存在問題。這是另一個問題:腳本文件可能在某個運行時環境中從不是全局上下文的上下文運行。

有人提出全球直接分配給window。但是,這也運行時依賴和節點等不起作用它表明一點,便攜全局變量管理需要注意一些問題和額外的努力。也許他們會在未來的ECMS版本中修復它!

現在,我會推薦這樣的事情,以支持適當的全球管理所有運行時環境:

/** 
* Exports the given object into the global context. 
*/ 
var exportGlobal = function(name, object) { 
    if (typeof(GLOBAL) !== "undefined") { 
     // Node.js 
     GLOBAL[name] = object; 
    } 
    else if (typeof(window) !== "undefined") { 
     // JS with GUI (usually browser) 
     window[name] = object; 
    } 
    else { 
     throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported."); 
    } 
}; 


// export exportGlobal itself 
exportGlobal("exportGlobal", exportGlobal); 

// create a new global namespace 
exportGlobal("someothernamespace", {}); 

這是一個有點打字,但它使你的全局變量管理面向未來的。

免責聲明:望着stacktrace.js以前的版本時,這種想法的一部分來找我。我認爲,還可以使用Bower或其他工具來獲得對運行時環境的更可靠和更少破壞性檢測。