Come dichiarare una variabile globale in un file .js

Ho bisogno di alcune variabili globali di cui ho bisogno in tutti i file .js .

Ad esempio, considera i seguenti 4 file:

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

C’è un modo in cui posso dichiarare 3 variabili globali in global.js e accedervi in ​​uno qualsiasi degli altri 3 file .js considerando che carico tutti i suddetti 4 file in un documento HTML?

Qualcuno può dirmi se è ansible o c’è un lavoro da fare per raggiungere questo objective?

Basta definire le variabili in global.js al di fuori dell’ambito di una funzione:

 // global.js var global1 = "I'm a global!"; var global2 = "So am I!"; // other js-file function testGlobal () { alert(global1); } 

Per assicurarti che funzioni, devi includere / link a global.js prima di provare ad accedere a qualsiasi variabile definita in quel file:

        [...]  

Potresti, naturalmente, colbind i tag dello script poco prima della chiusura -tag se non vuoi che il carico di js-files interrompa il caricamento iniziale della pagina.

L’approccio raccomandato è:

 window.greeting = "Hello World!" 

È quindi ansible accedervi in ​​qualsiasi funzione:

 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 a dichiarare le vars globali che erano destinate a essere locali o viceversa. Questo tipo di scope variabile è un punto di confusione per molti sviluppatori di Javascript. Quindi, come regola generale, mi assicuro che tutte le dichiarazioni delle variabili siano precedute dalla parola chiave var o dalla window del prefisso.

  2. Si standardizza questa syntax per leggere anche le variabili in questo modo, il che significa che una var localizzata non clobera la var globale o viceversa. Ad 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 sobject a errori (non è necessario ricordare tutte le regole di scope della variabile):

  function foo() { window.greeting = "Hello"; } function bar(greeting) { alert(greeting); } foo(); bar("Howdy"); // alerts "Howdy" 

L’hai provato?

Se fate:

 var HI = 'Hello World'; 

In global.js . E poi fai:

 alert(HI); 

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

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

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

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 direttamente alla window globale. Ma questo è anche dipendente dal tempo di esecuzione e non funziona in Nodo, ecc. Va a dimostrare che la gestione variabile delle variabili globali richiede una considerazione attenta e uno sforzo extra. Forse lo sistemeranno nelle future versioni di ECMS!

Per ora, consiglierei qualcosa come questo per supportare una corretta gestione globale per tutti gli ambienti 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", {}); 

È un po ‘più digitante, ma rende la gestione delle variabili globale a prova di futuro.

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.

Sì, puoi accedervi. Dovresti dichiararli in “spazio pubblico” (al di fuori di qualsiasi funzione) come:

 var globalvar1 = 'value'; 

Puoi accedervi in ​​seguito, anche in altri file.