2011-10-04 14 views
7

En la construcción siguiente:contexto IIFE emite

(function(){ 

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

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

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

})(); 

¿Por qué this se refieren a window objeto? ¿Debería aislarse todo lo que está dentro de IIFE del alcance global? ¿Son x y y funciones también propiedades del objeto global window?

Además, incluso si uso var h = ... poner al principio:

var h = (function(){ 

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

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

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

})(); 

this todavía se refiere a objeto de ventana - Yo sólo puedo llamar show() del ámbito mundial! ¿Cómo?

Respuesta

9

El contexto global (window en un navegador) es el valor que this obtiene cuando no hay otro valor para usar.

Sus variables locales son locales (es decir, no propiedades de window). Están declarados dentro de la función con var.

La razón por la que agregar var h = (function(){... no hace diferencia es debido a la forma en que llama a la función. La referencia de función no es un valor de propiedad de un objeto (como something.func()), y no se invoca con .call() o .apply(), por lo tanto, esto se refiere al objeto global (window). Así es como se define el lenguaje para actuar.

8

@Pointy es correcto, pero él no presenta todo el problema, usted podría estar interesado en this related answer. El problema aquí es que si no está utilizando la palabra clave new, no está instanciando un objeto, por lo que no hay ninguna instancia para que se refiera a this. En ausencia de una instancia, this se refiere al objeto window.

En general, no es necesario this dentro de un IIFE, porque tiene acceso directo a cualquier función o variable definida en el alcance de la función anónima - show() puede llamar x() y y() directamente, por lo que no hay necesidad de una referencia this . Puede haber un caso de uso válido para instanciar un IIFE con new, pero nunca lo he encontrado.

+0

Un caso válido sería cuando necesita pasar "esto" dentro de un IIFE a otro objeto que lo usa para hacer devoluciones de llamada. – AndroidDev

Cuestiones relacionadas