聲明一個全局變量,我需要,我需要的所有文件.js
幾個全局變量。如何在.js文件
例如,請考慮以下4個文件:
global.js
js1.js
js2.js
js3.js
有沒有我可以在聲明3個全局變量的方式global.js
並在t中訪問它們他其他3 .js
文件考慮我將所有上述4個文件加載到HTML文件?
是否有人可以告訴我,如果這是可能的,或者是有工作圍繞實現這一目標?
聲明一個全局變量,我需要,我需要的所有文件.js
幾個全局變量。如何在.js文件
例如,請考慮以下4個文件:
global.js
js1.js
js2.js
js3.js
有沒有我可以在聲明3個全局變量的方式global.js
並在t中訪問它們他其他3 .js
文件考慮我將所有上述4個文件加載到HTML文件?
是否有人可以告訴我,如果這是可能的,或者是有工作圍繞實現這一目標?
在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-文件負載中斷初始頁面加載標籤剛剛閉幕<體> - 標籤之前。
你試過了嗎?
如果你這樣做:
var HI = 'Hello World';
在global.js
。然後做:
alert(HI);
在js1.js
它會提醒它罰款。在HTML文檔的其餘部分之前,您只需包含global.js
。
,唯一的缺點是,你必須聲明它在窗口的範圍(內部沒有任何功能)。
你可以只尼克斯的var
一部分,並創造他們的方式,但它不是好的做法。
是的,你可以訪問它們。您應聲明它們在「公共空間」(外的任何功能)爲:
var globalvar1 = 'value';
您可以訪問他們以後,也在其他文件。
推薦的方法是:
window.greeting = "Hello World!"
然後,您可以任意函數內訪問:
function foo() {
alert(greeting); // Hello World!
alert(window["greeting"]); // Hello World!
alert(window.greeting); // Hello World! (recommended)
}
這是更可取的原因有兩個。
意圖是明確的。關鍵字var
的使用很容易導致聲明全局爲vars
,這意味着本地或反之亦然。對於很多Javascript開發人員來說,這種變量範圍是一個混亂點。因此,作爲一般規則,我確保所有變量聲明的前面都有關鍵字var
或前綴window
。
您可以通過這種方式來標準化讀取變量的語法,這意味着本地範圍的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"
如上所述,在腳本文件中使用最頂級的範圍存在問題。這是另一個問題:腳本文件可能在某個運行時環境中從不是全局上下文的上下文運行。
有人提出全球直接分配給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或其他工具來獲得對運行時環境的更可靠和更少破壞性檢測。
雖然這個答案是正確的,我建議你谷歌的Javascript的變量範圍,以獲得更好的瞭解,並可能避免做這種具體的方式。 – aleemb 2009-06-03 12:16:05
同意。我總是試圖將所有函數和變量放在一個共同的「命名空間」中,以避免混亂和衝突。通常我將它命名爲項目或公司的縮寫。 – PatrikAkerstrand 2009-06-03 12:40:17