Problèmes de contexte de l'IIFE

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é.