2011-10-04 2 views
7

émet Ia vie dans la construction suivante:contexte

(function(){ 

    var x = function(){ 
     alert('hi!'); 
    } 

    var y = function(){ 
     alert("hi again!"); 
    } 

    this.show = function(){ 
     alert("This is show function!"); 
    } 

})(); 

Pourquoi this référence à l'objet window? Faut-il isoler tout ce qui est à l'intérieur de l'IIFE de la portée mondiale? Sont x et y fonctions aussi les propriétés de window objet global?

En outre, même si je l'utilise mis 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 fait toujours référence à l'objet de la fenêtre - je peux appeler show() de la portée mondiale! Comment venir?

Répondre

9

Le contexte global (window dans un navigateur) correspond à la valeur this lorsque aucune valeur n'est utilisée.

Vos variables locales sont locales (c'est-à-dire, pas les propriétés de window). Ils sont déclarés dans la fonction avec var.

La raison pour laquelle l'ajout de var h = (function(){... ne fait aucune différence est due à la manière dont vous appelez la fonction. La référence de fonction n'est pas une valeur de propriété d'un objet (comme something.func()), et vous ne l'appelez pas avec .call() ou .apply(), donc cela fait référence à l'objet global (window). C'est juste la façon dont le langage est défini pour agir.

8

@Pointy est correct, mais il ne présente pas tout le problème - vous pourriez être intéressé par this related answer. Le problème ici est que si vous n'utilisez pas le mot-clé new, vous n'instanciez pas un objet, donc il n'y a pas d'instance pour this à se référer à. En l'absence d'une instance, this fait référence à l'objet window.

En général, vous n'avez pas besoin this dans un Ia vie, parce que vous avez un accès direct à une fonction ou variable définie dans le périmètre de la fonction anonyme - show() peut appeler x() et y() directement, donc il n'y a pas besoin d'une référence this . Il peut y avoir un cas d'utilisation valide pour instancier un IIFE avec new, mais je ne l'ai jamais rencontré.

+0

Un cas valide serait lorsque vous avez besoin de passer "ceci" dans un IIFE à un autre objet qui l'utilise pour faire des rappels. – AndroidDev