2009-06-11 6 views
19

Estoy creando un objeto JavaScript que contiene una función que ejecuta una each método jQuery como la siguiente:

function MyClass { 

    Method1 = function(obj) { 
    // Does something here 
    } 

    Method2 = function() { 
    $(".SomeClass").each(function() { 

     // 1   2 
     this.Method1(this); 

    }); 
    } 

} 

Qué objeto es cada THIS refiere? jQuery se refiere al artículo devuelto por la iteración each. Sin embargo, me gustaría que This[1] se refiera a la clase contenedora ...

¿Cómo puedo hacer referencia a la clase que contiene dentro del bucle jQuery?

Respuesta

20

Creo que se puede hacer algo como esto:

function MyClass { 
    Method1 = function(obj) { 
     //do something here 
    } 

    Method2 = function() { 
      var containingClass = this; 
      $(".SomeClass").each(function() { 
      containingClass.Method1(this); 
      }); 
     } 
    } 
} 
+1

alcance la variable containingClass a la función utilizando la palabra clave var. Si no lo hace irá en el espacio de nombres global. – tvanfosson

+3

-1 JavaScript 101: use var !!!!! – James

+1

Lanza una var en esa asignación ContainingClass, y esto es oro ... al punto, y una simple modificación de mi código publicado. –

9

De http://docs.jquery.com/Core/each:

Esto significa que cada vez que se ejecuta el función pasada en (que es una vez por cada elemento emparejado) la palabra clave "this" apunta al elemento DOM específico. Tenga en cuenta que 'esto' no indica a un objeto jQuery.

Personalmente, prefiero usar parámetros explícitos. De esta manera, es más fácil de leer:

$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    // code 
}); 

Para responder a su pregunta: JavaScript tiene dinámica alcance estático. Puede hacer lo siguiente:

var that = this; 
$('#rotfl').each(function(index, domObject) 
{ 
    var jQueryObject = $(domObject); 
    that.DoSomething(); 
    // code 
}); 
+0

Me gusta el detalle de su respuesta ... –

+0

Urm, ¿no te refieres al alcance léxico, no es dinámico? – James

+0

J-P: Sí. Gracias por mencionarlo. –

4

Lo que están viendo no es un problema con jQuery o su método each() - que es lo que algunas personas consideran que es un error de diseño en JavaScript - una función anidada debería "heredar" el contexto del ámbito anterior, por lo que 'esto' en una función anidada debe ser igual a 'esto' en su alcance padre a menos que a propósito se llama desde dentro de un contexto diferente (utilizando apply() o call()).

Para solucionar esto, debe asignar 'this' a una variable antes de la función anidada para que tenga otra manera de referenciarla.

+0

De hecho, se trata de jQuery.each(), que funciona mediante el uso de call() (en el caso más común) o apply() y, por lo tanto, cambia el objeto al que se refiere * this *. – NickFitz

+0

Sí, pero incluso si jQuery no llamó a()/apply() la función 'this' aún no sería la esperada. Pruébalo (function() {(function() {alert (!! this.works);/* No existe * /})()}). Call ({works: true}); – James

2

En jQuery 1.3.3, podrá establecer manualmente el contexto para los manejadores de eventos y demás.

jQuery Edge: Bind with a Different “this”

Mientras tanto, las diversas técnicas aquí (aliasing "este", usando la llamada/correspondan) son una práctica común. Peter Higgins de Dojo también hizo un jQuery.hitch plugin, que atiende la misma necesidad.

Cuestiones relacionadas