JavaScript - vérifier si dans le contexte mondial
-
23-08-2019 - |
Question
Lorsqu'une fonction est fixée à un objet et appelé:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
se réfère à l'objet que la fonction a été appelée en tant que méthode de. Il est équivalent à faire f.call(o)
.
Lorsque la fonction est appelée non dans le cadre d'un objet, this
fait référence à l'objet global. Comment puis-je vérifier si une fonction est appelée à partir d'un contexte non-objet? Yat-il un mot clé standard pour accéder à l'objet global? La seule façon de le faire quelque chose comme ça?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
Note: Je pense aucun cas d'utilisation particulière ici - En fait, je vous demande au sujet de ce mécanisme exact
.La solution
L'objet global est en fait la fenêtre de sorte que vous pouvez faire
if (this === window)
Autres conseils
Le ci-dessous devrait fonctionner puisque l'utilisation Function.call avec une valeur nulle invoquera dans la portée globale.
this === ((function () { return this; }).call(null))
Une variante plus simple,
this === (function () { return this; })()
va aussi travailler, mais je pense que la première fait l'intention plus claire.
La réponse de RoBorg est conceptuellement correcte - à l'exception window
est disponible uniquement dans le contexte des navigateurs thread principal (donc cela exclut nécessairement les threads de travail, etc., ainsi que tout non-navigateur hébergé JS, qui devient de moins en moins rare).
Votre pari le plus sûr est essentiellement ce que vous aviez ci-dessus, mais vous devez utiliser var
et ===
comme il est possible pour l'interprète d'optimiser les accès plus complètement.