Dans la construction suivante:
(function(){ var x = function(){ alert('hi!'); } var y = function(){ alert("hi again!"); } this.show = function(){ alert("This is show function!"); } })();
Pourquoi this
réfère-t- this
à l'objet window
? Est-ce que tout à l'intérieur d'IIFE devrait être isolé de portée globale? Les fonctions x
et y
sont-elles également des propriétés de l'objet global de window
?
Aussi, même si j'utilise put var h = ...
au début:
var h = (function(){ var x = function(){ alert('hi!'); } var y = function(){ alert("hi again!"); } this.show = function(){ alert("This is show function!"); } })();
this
se réfère toujours à l'objet fenêtre – je peux simplement appeler show()
de la portée globale! Comment venir?
Le contexte global ( window
dans un navigateur) est la valeur obtenue lorsqu'il n'y a pas d'autre valeur à utiliser.
Vos variables locales sont locales (c'est-à-dire non les propriétés de la window
). Ils sont déclarés dans la fonction avec var
.
La raison pour laquelle ajouter var h = (function(){...
ne fait aucune différence en raison de la façon dont vous appelez la fonction. La référence de la fonction n'est pas une valeur de propriété d'un objet (comme something.func()
) et vous Ne l'invoquez pas avec .call()
ou .apply()
, donc donc il s'agit de l'objet global ( window
). C'est la manière dont la langue est définie pour agir.
@Pointy est correct, mais il ne présente pas tout le problème – vous pourriez être intéressé par cette réponse connexe . Le problème ici est que si vous n'utilisez pas le new
mot-clé, vous n'êtes pas en train d'instancier un objet, donc il n'y a aucune instance à laquelle this
se réfère. En l'absence d'une instance, this
réfère à l'objet window
.
En général, vous n'avez pas besoin de this
dans un IIFE, car vous avez un accès direct à toute fonction ou variable définie dans la portée de la fonction anonyme – show()
peut appeler x()
et y()
directement, donc il n'est pas nécessaire d'avoir this
référence. Il peut y avoir un cas d'utilisation valide pour instancier un IIFE avec un new
, mais je ne l'ai jamais rencontré.