Come dichiarare una variabile globale in un file .js


86

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

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 global.jse accedervi in ​​uno qualsiasi degli altri 3 .jsfile considerando che carico tutti i 4 file sopra in un documento HTML?

Qualcuno può dirmi se questo è possibile o c'è un modo per farlo?

Risposte:


96

Basta definire le variabili in global.js al di fuori dell'ambito della 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:

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

Potresti, ovviamente, collegare i tag dello script appena prima del tag di chiusura <body> se non vuoi che il caricamento dei file js interrompa il caricamento iniziale della pagina.


4
Sebbene questa risposta sia corretta, ti consiglierei di utilizzare l'ambito delle variabili JavaScript di Google per ottenere una migliore comprensione ed eventualmente evitare di fare le cose in questo modo esatto.
Aleemb

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

Downvoting questa risposta e le altre simili perché presume che la variabile globale verrà creata in un ambito globale e richiede anche che la prima menzione della variabile sia nell'ambito globale prima di tutte le altre menzioni.
Andrew

1
@Andrew Questa risposta è stata scritta otto anni fa. A tutti gli effetti, allora era corretto. Se vuoi effettivamente dare un contributo, potresti suggerire invece una modifica?
PatrikAkerstrand

@PatrikAkerstrand Gli appuntamenti in realtà non fanno differenza. Le altre risposte che utilizzano un oggetto globale sono sufficienti; Ho spiegato perché non lo è.
Andrew

89

L'approccio consigliato è:

window.greeting = "Hello World!"

È quindi possibile accedervi all'interno di qualsiasi funzione:

function foo() {

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

}

Questo approccio è preferito per due ragioni.

  1. L'intento è esplicito. L'uso della varparola chiave può facilmente portare a dichiarare globali varsche dovevano essere locali o viceversa. Questo tipo di scoping variabile è un punto di confusione per molti sviluppatori Javascript. Quindi, come regola generale, mi assicuro che tutte le dichiarazioni di variabili siano precedute dalla parola chiave varo dal prefisso window.

  2. Standardizzi questa sintassi anche per leggere le variabili in questo modo, il che significa che una con scope locale varnon blocca la global varo viceversa. Ad esempio, ciò che accade 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 a errori (non è davvero necessario ricordare tutte le regole di scoping delle variabili):

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

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

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

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

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

1
@zkent, è vero, ma usare l'oggetto Window è ancora meglio perché potresti voler trasformare il tuo codice in qc come il caffè più tardi.
Nami WANG

È meglio usare Window piuttosto che il prefisso del documento?
Andrew

7

L'hai provato?

Se fate:

var HI = 'Hello World';

In global.js. E poi fai:

alert(HI);

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

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

Potresti semplicemente annullare la varparte e crearli in questo modo, ma non è una buona pratica.


7

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

È stato proposto di assegnare windowdirettamente il globale a . Ma anche questo dipende dal tempo di esecuzione e non funziona in Node ecc. Ciò dimostra che la gestione delle variabili globali portabile richiede un'attenta considerazione e uno sforzo extra. Forse lo risolveranno nelle future versioni di ECMS!

Per ora, consiglierei qualcosa di simile per supportare una corretta gestione globale per tutti gli ambienti di runtime:

/**
 * 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ù di digitazione, ma rende la gestione delle variabili globali a prova di futuro.

Dichiarazione di non responsabilità: parte di questa idea mi è venuta guardando le versioni precedenti di stacktrace.js .

Penso che si possa anche usare Webpack o altri strumenti per ottenere un rilevamento più affidabile e meno hacker dell'ambiente di runtime.


2
GLOBALè ora deprecato e globaldovrebbe essere utilizzato al suo posto.
Thomas

2

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

var globalvar1 = 'value';

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.