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

.
Était-ce utile?

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.

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