Eh bien, vous pouvez utiliser l' typeof
de l'opérateur, et si l'identifiant n'existe pas dans n'importe quel endroit de la chaîne d'étendue, il ne sera pas jeter un ReferenceError
, il sera de retour "undefined"
:
if (typeof ModuleName != 'undefined') {
//...
}
Rappelez-vous aussi que l' this
de la valeur sur le code Mondial, se réfère à l'objet global, ce qui signifie que si votre if
déclaration est le contexte mondial, vous pouvez simplement cocher this.ModuleName
.
À propos de l' (function () { return this; }());
technique, vous avez raison, sur le mode strict de l' this
de la valeur sera simplement undefined
.
En vertu de la mode strict, il y a deux façons d'obtenir une référence à l'objet Global, peu importe où vous êtes:
Fonctions créées avec l' Function
constructeur de ne pas hériter de la rigueur de l'appelant, ils sont stricts que si ils commencent leur corps avec l' 'use strict'
directive, sinon ils sont non-strictes.
Cette méthode est compatible avec n'importe quel ES3 mise en œuvre.
-
Par le biais d'un indirectes eval
appel, par exemple:
"use strict";
var get = eval;
var global = get("this");
Le ci-dessus ne fonctionne, parce que dans l'ES5, indirects appels d' eval
, l'utilisation de l' environnement mondial est la variable de l'environnement et de l'environnement lexical pour l'eval code.
Voir les détails sur la Saisie Eval Code, à l'Étape 1.
Mais sachez que la dernière solution ne fonctionnera pas sur ES3 implémentations, car un appel indirect à l' eval
sur ES3 utilisera les variables lexicales et des environnements de l'appelant que les environnements pour les eval code lui-même.
Et enfin, vous pourriez trouver utile de détecter si le mode strict est pris en charge:
var isStrictSupported = (function () { "use strict"; return !this; })();