¿Cómo puedo mantener el context de 'esto' en jquery

Tengo algo como esto:

var Something = function(){ this.render = function(){}; $(window).resize(function(){ this.render(); }); } 

El problema es que dentro de la function anónima 'esto' se refiere al object window. Sé que podría hacer algo como:

 var Something = function(){ this.render = function(){}; var tempThis = this; $(window).resize(function(){ tempThis.render(); }); } 

¿Pero hay una manera mejor? Esto no se ve muy elegante.

La solución que encontraste es la que la mayoría de la gente usa. La convención común es llamar a su variable temporal "eso".

 var Something = function(){ this.render = function(){}; var that = this; $(window).resize(function(){ that.render(); }); }; 

Esa parece ser tu mejor opción, no creo que haya una mejor manera. (Alguien me corrige si estoy equivocado).

FYI la capacidad de controlar esto viene en la próxima versión de JQuery

Lo he estado haciendo de esta manera en muchas situaciones difíciles. No se ve elegante, pero nunca falla. En realidad, eso es javascript closed en acción.

jrh

Eso es exactamente lo que hago. No es específico de jQuery, tampoco.

 var Construct = function() { var self = this; //preserve scope this.materials = 2000; this.build = function(){ self.materials -= 100; }; }; 

Recuerde usar la palabra key var delante de su nueva variable de ámbito. De lo contrario, estás creando una nueva variable global. Como variable local, seguirá siendo accesible dentro de la function interna a través de un cierre.

La mejor solución para mantener las variables al mínimo sería usar el método Function.prototype.bind ().

 var Something = function(){ this.render = function(){}; $(window).resize( this.render.bind( this ) ); } 

El problema con este método que puede causar complicaciones en el futuro, lo que significa que debe elegir usarlo con moderación, es cuando necesita invocar $(this) para tomar el elemento. Por lo tanto, podría sugerir que valdría la pena utilizar Function.prototype.bind() en su método de cambio de tamaño, pero no sería una buena solución usarlo en una function de clic que pueda necesitar para dirigir el elemento cliqueado directamente.

Vea este JSFiddle para un ejemplo de trabajo.

Consulte la documentation de Mozilla en Function.prototype.bind () para get más información

Los otros methods son utilizables, pero la creación de una variable para mantener el context de esto es el efecto no deseado según su pregunta.