Comment déclarer des variables globales lorsque vous utilisez le mode pragma strict

Il est considéré comme une bonne pratique d'utiliser une fonction d'auto-appel pour envelopper un code conforme au mode strict, souvent appelé pragma de mode strict:

(function(){ "use strict"; // Strict code here }()); 

Ma question est de savoir comment déclarer des variables globales dans ce cas? Trois alternatives que je connais aujourd'hui:

Variante 1:

 var GLOB = {}; (function(){ "use strict"; }()); 

Variante 2:

 (function(){ "use strict"; window.GLOB = {}; }()); 

Variante 3:

 (function(win){ "use strict"; win.GLOB = {}; }(window)); 

Des préférences et des motivations? Autres options?

L'alternative 3 de l'OMI est la meilleure. Mais il suppose que la window représente la portée globale – ce qui est vrai pour le navigateur mais pas pour d'autres environnements JS (ligne de commande, Node.js, etc.).

Les éléments suivants se déroulent de façon générale:

 (function(globals){ "use strict"; globals.GLOB = {}; }(this)); 

Je sais que c'est une question ancienne, mais il n'y a pas une manière mentionnée d'avoir un contexte mondial:

 (function(globals){ "use strict"; globals.GLOB = {}; }( (1,eval)('this') )); 

(1,eval)('this')

Va évaluer this partir d'un contexte global, afin que vous puissiez coller ceci où vous le souhaitez et que vous obtiendrez toujours un contexte global

La méthode 1 échouerait si elle était collée dans une autre fonction.

En utilisant la méthode 3, il est plus facile d'exporter vos méthodes vers un autre espace de noms. Il suffit de remplacer la window avec, par exemple, les frames[0] ou le document suffit pour joindre toutes les méthodes à un espace de noms personnalisé.

Je recommande la méthode 3, pour la dernière raison.

Les avantages de alt 2 et 3 sont qu'ils gardent tout le code dans la "fonction conteneur". Une ligne de code en dehors de la fonction est facile à manquer lors de la lecture du code.

Aussi:

  • "GLOB" devrait être le nom de l'application. – Vous souhaitez autoriser plus d'une application par fichier html / js sans collisions de noms.

Andrea Giammarchi a une belle technique pour faire cela, qui fonctionne dans les navigateurs. Définissez une fonction dans votre fonction d'auto-appel appelée globalEval comme tel:

 (function () { "use strict"; function globalEval(data) { data = data.replace(/^\s*|\s*$/g, ""); if (data) { var head = document.getElementsByTagName("head")[0] || document.documentElement, script = document.createElement("script"); script.type = "text/javascript"; script.text = data; head.appendChild(script); head.removeChild(script); } } // use globalEval to stick variables into the global scope globalEval("var myGlobal = 1;"); // myGlobal === 1 )(); // myGlobal === 1 

Ou définissez la fonction globalEval en dehors du code d'appel automatique si vous souhaitez l'utiliser dans d'autres domaines.