2009-06-03 25 views
76

Ho bisogno di alcune variabili globali di cui ho bisogno in tutti i file .js.Come dichiarare una variabile globale in un file .js

Ad esempio, considerare i 4 file seguenti:

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

C'è un modo che io possa dichiarare 3 variabili globali in global.js e accedervi in ​​uno qualsiasi di t altri 3 file .js considerando che carico tutti i suddetti 4 file in un documento HTML?

Qualcuno può dirmi se è possibile o c'è un lavoro da fare per raggiungere questo obiettivo?

risposta

84

Basta definire le variabili in global.js al di fuori di un ambito funzione:

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

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

Per assicurarsi che questo funziona è necessario includere/link per global.js prima di tentare di accedere a tutte le variabili definite in quel file:

<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> 

si potrebbe, ovviamente, di collegamento nello script tag poco prima della chiusura <corpo> -tag se non si desidera che il carico di JS-files per interrompere il caricamento della pagina iniziale.

+4

Mentre questa risposta è corretta, ti suggerisco di utilizzare l'ambito della variabile JavaScript di Google per ottenere una migliore comprensione ed eventualmente evitare di fare le cose in questo modo. – aleemb

+1

concordato. Cerco sempre di definire tutte le funzioni e le variabili in uno "spazio dei nomi" comune per evitare ingombri e conflitti. Di solito lo chiamo come abbreviazione del progetto o dell'azienda. – PatrikAkerstrand

+0

Downvoting a questa risposta e agli altri piace perché presuppone che la variabile globale verrà creata in un ambito globale e richiede anche che la prima menzione della variabile sia nello scope globale prima di tutte le altre menzioni. – Andrew

6

Hai provato?

Se lo fai:

var HI = 'Hello World'; 

In global.js. E poi fare:

alert(HI); 

In js1.js avviserà che bene. Devi solo includere global.js prima del resto nel documento HTML.

L'unico problema è che è necessario dichiararlo nell'ambito della finestra (non all'interno di alcuna funzione).

Si potrebbe semplicemente nixare la parte var e crearli in questo modo, ma non è una buona pratica.

2

Sì, è possibile accedervi. Si dovrebbe dichiarare in 'spazio pubblico' (fuori da qualsiasi funzione) come:

var globalvar1 = 'value'; 

È possibile accedere in seguito, anche in altri file.

78

L'approccio consigliato è:

window.greeting = "Hello World!" 

È quindi possibile accedere all'interno delle funzioni:

function foo() { 

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

} 

Questo approccio è preferito per due motivi.

  1. L'intento è esplicito. L'uso della parola chiave var può facilmente portare alla dichiarazione globale vars che era destinata a essere locale o viceversa. Questo tipo di scope variabile è un punto di confusione per molti sviluppatori di Javascript. Pertanto, come regola generale, mi assicuro che tutte le dichiarazioni delle variabili siano precedute dalla parola chiave var o dal prefisso window.

  2. a standardizzare questa sintassi per la lettura delle variabili in questo modo pure il che significa che un ambito locale var non clobber globale var o viceversa. Per esempio quello che succede qui è ambiguo:

 

greeting = "Aloha"; 

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

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

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

Tuttavia, questo è molto più pulito e meno soggetto ad errori (non si ha realmente bisogno di ricordare tutte le regole di scoping variabile):

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

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

foo(); 
bar("Howdy"); // alerts "Howdy" 
+0

Questo tipo di dichiarazione funziona con X-Browser? – nottinhill

+0

Il collegamento di variabili alla finestra dovrebbe funzionare su tutti i browser (ed è anche l'approccio che prendo, +1!). – Dandy

+1

@Dan, se si dichiara "var testvar = 'hello';" al di fuori di una funzione, viene automaticamente aggiunto all'oggetto della finestra ed è possibile accedervi con "window.testvar". – zkent

3

Come accennato in precedenza, ci sono problemi con l'utilizzo dell'ambito più in alto nel file di script. Ecco un altro problema: il file di script potrebbe essere eseguito da un contesto che non è il contesto globale in alcuni ambienti di runtime.

È stato proposto di assegnare il globale a window direttamente. Ma questo è anche dipendente dal tempo di esecuzione e non funziona nel nodo, ecc. Va a dimostrare che la gestione variabile delle variabili globale richiede una considerazione attenta e uno sforzo extra. Forse lo sistemeranno nelle future versioni di ECMS!

Per il momento, mi sento di raccomandare qualcosa di simile per sostenere una corretta gestione globale per tutti gli ambienti di run-time:

/** 
* 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", {}); 

E 'una digitazione po' di più, ma rende il vostro futuro a prova di gestione variabile globale.

Disclaimer: Parte di questa idea mi è venuta quando ho esaminato le versioni precedenti di stacktrace.js. Suppongo che si possa usare Bower o altri strumenti per ottenere un rilevamento più affidabile e meno hackerato dell'ambiente di runtime.

Problemi correlati