J'ai besoin de quelques variables globales dont j'ai besoin dans tous les .js
fichiers.
Par exemple, considérez les 4 fichiers suivants:
global.js
js1.js
js2.js
js3.js
Existe-t-il un moyen de déclarer 3 variables globales dans global.js
et d'y accéder dans l'un des 3 autres .js
fichiers en considérant que je charge les 4 fichiers ci-dessus dans un document HTML?
Quelqu'un peut-il me dire si cela est possible ou y a-t-il une solution pour y parvenir?
L'approche recommandée est:
window.greeting = "Hello World!"
Vous pouvez ensuite y accéder dans n'importe quelle fonction:
function foo() { alert(greeting); // Hello World! alert(window["greeting"]); // Hello World! alert(window.greeting); // Hello World! (recommended) }
Cette approche est préférée pour deux raisons.
L'intention est explicite. L'utilisation du
var
mot - clé peut facilement conduire à déclarer des globauxvars
destinés à être locaux ou vice versa. Ce type de portée variable est un point de confusion pour de nombreux développeurs Javascript. Donc, en règle générale, je m'assure que toutes les déclarations de variables sont précédées du mot-clévar
ou du préfixewindow
.Vous standardisez également cette syntaxe pour lire les variables de cette manière, ce qui signifie qu'une portée locale
var
ne coupe pas le globalvar
ou vice versa. Par 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 sujet aux erreurs (vous n'avez pas vraiment besoin de vous souvenir de toutes les règles de portée des variables):
function foo() { window.greeting = "Hello"; } function bar(greeting) { alert(greeting); } foo(); bar("Howdy"); // alerts "Howdy"
la source
L'as tu essayé?
Si tu fais:
var HI = 'Hello World';
Dans
global.js
. Et puis faites:Dans
js1.js
cela l'alertera très bien. Il vous suffit d'inclureglobal.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 dans aucune fonction).
Vous pouvez simplement supprimer la
var
pièce et la créer de cette façon, mais ce n'est pas une bonne pratique.la source
Comme mentionné ci-dessus, il y a des problèmes avec l'utilisation de la portée la plus élevée dans votre fichier de script. Voici un autre problème: le fichier de script peut être exécuté à partir d'un contexte qui n'est pas le contexte global dans un environnement d'exécution.
Il a été proposé d'assigner
window
directement le global . Mais cela dépend également de l' exécution et ne fonctionne pas dans Node, etc. Cela montre que la gestion des variables globales portables nécessite une attention particulière et des efforts supplémentaires. Peut-être qu'ils le corrigeront dans les futures versions d'ECMS!Pour l'instant, je recommanderais quelque chose comme celui-ci pour prendre en charge une gestion globale appropriée 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 typé, mais cela rend votre gestion globale des variables pérenne.
Avis de non-responsabilité: Une partie de cette idée m'est venue en regardant les versions précédentes de stacktrace.js .
Je pense que l'on peut également utiliser Webpack ou d'autres outils pour obtenir une détection plus fiable et moins piratée de l'environnement d'exécution.
la source
GLOBAL
est désormais obsolète etglobal
doit être utilisé à la place.Oui, vous pouvez y accéder. Vous devez les déclarer dans `` l'espace public '' (en dehors de toute fonction) comme:
var globalvar1 = 'value';
Vous pourrez y accéder ultérieurement, également dans d'autres fichiers.
la source