Question

Quelle est la méthode recommandée pour maîtriser le objet global en mode strict ES5 dans un environnement hôte inconnu?

ECMAScript ne fournit pas de moyen intégré de référencer l'objet global que je connais.Si c'est le cas, c'est la réponse que je recherche.

Dans un environnement connu, l'objet global possède généralement une propriété auto-référentielle.Puisque l'objet global est le VO pour la portée globale, les propriétés de l'objet global sont des variables globales, nous pouvons donc les utiliser pour accéder à l'objet global depuis n'importe où :

  • Dans un navigateur Web, nous pouvons utiliser window ou self.

  • Dans node.js, nous pouvons utiliser global.

Toutefois, ce n’est pas nécessairement le cas dans tous les environnements hôtes.Autant que je sache, Windows Script Host ne fournit aucun moyen d'accéder à l'objet global.La méthode recommandée pour obtenir l'objet global dans WSH semble être d'utiliser le this mot-clé dans un contexte où il ne se résout pas en un objet.Par exemple:

var GLOBAL = (function(){return this}());

Cette technique fonctionnera pour n'importe quel environnement hôte, mais pas en mode strict, car un this ne fait pas référence à l'objet global dans mode strict:

Si ceci est évalué dans le code en mode strict, alors cette valeur n'est pas contrainte à un objet. Une valeur nulle ou indéfinie n'est pas convertie en objet global et les valeurs primitives ne sont pas converties en objets wrapper.La valeur this transmise via un appel de fonction (y compris les appels effectués à l'aide de Function.prototype.apply et Function.prototype.call) ne force pas la transmission de cette valeur à un objet (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).

Comme prévu, le code suivant donne undefined:

(function(){
    "use strict";
    var GLOBAL = (function(){return this}());
    console.log(GLOBAL);
}());

Alors, quelle est la bonne façon de obtenir un handle sur l'objet global dans n'importe quel environnement, quel que soit le mode strict?

À propos, mon approche actuelle consiste à rechercher des variables globales faisant référence à l'objet global comme ceci :

var self, window, global = global || window || self;

... et puis utilisez simplement global.Je pense que c'est une mauvaise solution pour un certain nombre de raisons, dont la plupart sont assez évidentes, et elle ne résout pas le problème WSH.

Était-ce utile?

La solution

Dans ES5, vous pouvez obtenir une référence à un objet global en mode strict via un appel d'évaluation indirect :

"use strict";
var global = (1,eval)('this');

Jeter un coup d'œil à mon article;surtout à ce moment section sur le mode strict.

Autres conseils

Dans code global, le thisBinding est défini sur l'objet global quel que soit le mode strict.Cela signifie que vous pouvez le transmettre à partir de là dans votre module IEFE :

// "use strict"; or not
(function(global) {
    "use strict";
    …
    console.log(global);
    …
}(this));

En mode strict, la manière d'obtenir une référence à l'objet global consiste à attribuer une variable dans l'objet global se référençant lui-même.

C'est this désigne l'objet global dans le contexte global, donc la solution est simplement :

"use strict";
var global = global || this;
(function() { global.hello = "world"; })();
console.log(hello); // Outputs 'world' as expected

Ce fait signifie que vous devez polluer l'espace de noms global avec une référence à lui-même, mais comme vous le dites, il aurait déjà dû être là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top