88 votes

Comment déclarer une variable globale dans un fichier .js

J'ai besoin d'un peu de variables globales que j'ai besoin de tous les .js fichiers.

Par exemple, considérons la suite de 4 fichiers:

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

Est-il possible que je peux déclarer 3 variables globales en global.js et l'accès de l'une des autres 3 .js fichiers, étant donné que je charge tous les 4 fichiers dans un document HTML?

Quelqu'un peut-il me dire si c'est possible ou est-il un travail autour pour y parvenir?

98voto

PatrikAkerstrand Points 23968

Définissez simplement vos variables dans global.js en dehors de la portée d'une fonction:

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

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

Pour vous assurer que cela fonctionne, vous devez inclure / link to global.js avant d'essayer d'accéder aux variables définies dans ce fichier:

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

Vous pouvez, bien entendu, créer un lien dans les balises de script juste avant la balise <body> -tag si vous ne souhaitez pas que le chargement de fichiers js interrompt le chargement initial de la page.

91voto

aleemb Points 12138

L'approche recommandée est:

window.greeting = "Hello World!"

Vous pouvez ensuite accéder à l'intérieur de n'importe quelle fonction:

function foo() {

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

}

Cette approche est privilégiée pour deux raisons.

  1. L'intention est explicite. L'utilisation de l' var mot-clé peut facilement conduire à la déclaration mondiale vars qui étaient destinés à être locale ou vice versa. Ce genre de la portée des variables est un point de confusion pour beaucoup de développeurs Javascript. Donc, en règle générale, j'ai assurez-vous que toutes les déclarations de variables sont précédées du mot-clé var ou le préfixe window.

  2. Vous normaliser cette syntaxe pour la lecture des variables de cette façon ce qui signifie qu'un configuré localement var n'a pas supprimé le global var ou vice versa. Pour exemple ce qui se passe ici est ambiguë:

 

 greeting = "Aloha";

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

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

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

Cependant, c'est beaucoup plus propre et moins sujette aux erreurs (vous n'avez pas vraiment besoin de se rappeler de toutes les variables règles de portée):

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

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

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

7voto

Paolo Bergantino Points 199336

L'as tu essayé?

Si tu fais:

 var HI = 'Hello World';
 

En global.js . Et ensuite faire:

 alert(HI);
 

En js1.js cela alertera très bien. Vous devez simplement inclure global.js avant le reste dans le document HTML.

Le seul problème est que vous devez le déclarer dans la portée de la fenêtre (et non à l'intérieur d'une fonction).

Vous pouvez simplement supprimer la partie var et la créer de cette façon, mais ce n'est pas une bonne pratique.

7voto

Domi Points 2724

Comme mentionné ci-dessus, il y a des problèmes avec l'utilisation de la plus haute portée dans votre fichier de script. C'est un autre problème: Le fichier de script peut être exécuté à partir d'un contexte qui n'est pas le contexte global dans certains environnement d'exécution.

Il a été proposé d'attribuer le mondial de window directement. Mais c'est aussi le moment de l'exécution dépendant et ne fonctionne pas dans le Nœud etc. Il va montrer que portable variable globale des besoins de gestion d'une période de réflexion et un effort supplémentaire. Peut-être qu'ils vont le corriger à l'avenir ECM versions!

Pour l'instant, je vous recommande de quelque chose comme cela pour soutenir la bonne gestion globale pour tous les environnements d'exécution:

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

C'est un peu plus saisissant, mais il rend votre variable globale de la gestion de l'avenir.

Avertissement: une Partie de cette idée m'est venue en regardant stacktrace.js.

2voto

Ropstah Points 7902

Oui, vous pouvez y accéder. Vous devez les déclarer dans "l'espace public" (en dehors de toute fonction) en tant que:

 var globalvar1 = 'value';
 

Vous pourrez y accéder ultérieurement, également dans d'autres fichiers.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X