2011-11-02 7 views
7

Ok, así que pensé que entendía esto (sin juego de palabras), pero aparentemente no.esta palabra clave es objeto de ventana dentro de una función de constructor

var Constructor = function() { 
    var internalFunction = function() { 
     return this === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 

Estas alertas true. ¿Por qué no puede la función interna ver this como el objeto? En su lugar, tengo que usar alert(internalFunction.call(this)); en myMethod.

Editar: que estaba buscando una explicación de por qué se le asigna this de esa manera, no soluciones tales como var self = this;, etc. Lo siento si no lo dejan claro.

+1

Ninguna de las respuestas a estas preguntas usa 'that'. Me siento traicionado. – hugomg

+0

@missingno: No me gusta 'eso'. No es descriptivo Dicho esto, mi propia elección en mi respuesta no es mejor :) –

+0

+1 para juegos de palabras involuntarios – SMC

Respuesta

6

this no está vinculado hasta que se llame a la función y dependa de cómo se llame a la función. Podría pensarlo como un parámetro adicional implícitamente pasado a la función.

En este caso, el problema es que está llamando internalFunction usando internalFunction(). El valor this se establece llamando a una función como método (como en foo.bar() o foo["bar"]()) o estableciendo this explícitamente a través de call() o apply(). Su llamada tampoco lo hace para que this revierte al objeto global.

La forma más sencilla de lograr lo que desea en este caso, manteniendo internalFunction privada es almacenar una referencia a this dentro de la función constructora:

var Constructor = function() { 
    var thisObj = this; 

    var internalFunction = function() { 
     return thisObj === window; 
    }; 

    thisObj.myMethod = function() { 
     alert(internalFunction()); 
    }; 
} 
+0

Ah, eso tiene sentido ... 'this' se asigna en el tiempo de llamada, por lo que al llamar a' innerFunction() 'estoy llamando implícitamente a' window.internalFunction() '. Bien explicado. –

+0

Voy a tomar la asignación de funciones por declaración cualquier día ... – jondavidjohn

+0

@jondavidjohn: No voy a entrar en una discusión sobre eso y fue un ajuste innecesario al código original de mi parte, así que lo he revertido. Gracias por mencionarlo. –

1

Es una cuestión de alcance intentar algo como:

var Constructor = function() { 
    var $this = this; 
    var internalFunction = function() { 
     return $this === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 
3

Debido a reglas de alcance funcionales, this es reasignado dentro de cada función ... Me gustaría guardar una copia de su objeto como self y usarlo en consecuencia ..

var Constructor = function() { 

    var self = this; 

    var internalFunction = function() { 
     return self === window; 
    }; 
    this.myMethod = function() { 
     alert(internalFunction()); 
    }; 
}; 
var myObj = new Constructor(); 
myObj.myMethod(); 

Debe darle la salida que espera.

sidenote

Ésta es una práctica bastante precaria que javascript está creado, sobre todo porque si se olvida la palabra clave new cuando se utiliza Constructor, que se obtener this refiriéndose al objeto window (dios) por lo tanto, adjuntará myMethod a la ventana sin previo aviso.

2

Hay cinco formas de llamar a una función en JavaScript. El valor de this depende de lo que le conviene más:

  1. llamada a la función global (por ejemplo myFunction()). No se proporciona ningún valor explícito para this. El valor de this será el objeto predeterminado (window en un navegador).
  2. Llamada al método (por ejemplo, obj.myFunction()).El valor de this es el objeto sobre el que se invocó el método (obj en este caso).
  3. Usando el método call (por ejemplo, myFunction.call(obj)). El valor de this se proporciona explícitamente (en este caso obj).
  4. Usando el método apply (por ejemplo, myFunction.apply(obj)). El valor de this se proporciona explícitamente (en este caso obj).
  5. Función de constructor (por ejemplo, new MyFunction()). El valor de this es un objeto creado recientemente proporcionado por el tiempo de ejecución.

Cada uno de los cinco se explica con más detalle aquí:

Cuestiones relacionadas