Contexte global à l'intérieur du modèle UMD

J'écris un mécanisme de journalisation agnostique qui fonctionne dans le navigateur et dans nodejs (p.ex. console.debug manque dans nodejs).

// UMD with no dependencies (function(global, factory) { if (typeof module === 'object') { module.exports = factory(); // GLOBAL IS NOT WHAT I WOULD EXPECT, YOU? global.console = factory(); } else if (typeof define === 'function' && define.amd) { define(factory); } else { global.console = factory(); } })(this, function() { function logger() {}; return logger; }); 

Je suis tombé sur 2 différences que je ne peux pas expliquer:

  1. Comme prévu, pour le cas du navigateur, la variable 'global' a la valeur de la fenêtre. Cependant, avec Nodejs 'global' est juste un objet simple et non la variable globale de Nodejs. Est-ce prévu? On pourrait exécuter le module en utilisant '.call' pour conserver le contexte correspondant pour le navigateur et Nodejs. Comme il s'agit d'un modèle UMD commun accepté, je doutais s'il ne fallait pas modifier la variable globale dans Nodejs, ce qui me mène à la prochaine question.

  2. À l'intérieur du navigateur, il est possible d'écraser la fonction console globale en passant mon objet personnalisé à la propriété console. On pourrait revenir sur l'ancien comportement en rétablissant la référence à l'objet d'origine. Ceci n'est pas possible dans Nodejs, il échoue lorsque j'essaie de passer mon propre objet logger à global.console. Assez étrange, je n'ai trouvé aucune documentation utile sur le Web …

J'espère obtenir des éclaircissements!

METTRE À JOUR

Apparemment, les éléments suivants peuvent ne pas fonctionner dans toutes les situations de Chrome. Voir les commentaires sur cette réponse .

Réponse originale

J'utilise ce qui suit au lieu de this dans mon code pour obtenir l'objet global. Il semble étanche dans les environnements ECMAScript 3 et 5:

 (function(f) { return f("return this")(); })(Function) 

Ceci est un peu indirect dans le but d'apaiser linters, tels que JSLint, qui n'aiment pas l'utilisation d' eval et le constructeur de Function . Si vous ne vous occupez pas de ces choses (yay pour vous), vous pouvez utiliser le code simple suivant à la place:

 Function("return this")() 

Contexte: