2011-01-27 15 views
5

Esto es más un control de cordura que cualquier otra cosa. He descubierto que cuando se trabaja con cierres en Javascript que a menudo utilizan el siguiente patrón para acceder a la clase envolvente dentro de la función:Accediendo a 'esto' en el cierre de Javascript

MyClass.prototype.delayed_foo = function() { 
    var self = this; 
    setTimeout(function() { 
     self.foo(); // Be nice if I could use 'this' here 
    }, 1000); 
}; 

Obviamente esto funciona muy bien, y ni siquiera es un gran problema para trabajar con . Solo tengo este pequeño picor en la parte posterior de mi cerebro que dice '¡Estás haciendo esto demasiado complicado, tonto!' ¿Es este el patrón comúnmente aceptado?

Respuesta

6

Este es el patrón comúnmente aceptado con la excepción de que that se usa a menudo en lugar de self.

+0

bueno saber . Acababa de elegir lo que me resultaba familiar. :) (¡Fan de Big Python!) – Toji

4

Puede tirar de un astuto utilizando una función de unión de esta manera:

var Binder = function(fnc, obj) { 
    return function() { 
     fnc.apply(obj, arguments); 
    }; 
}; 

y luego cambiar su llamada a

MyClass.prototype.delayed_foo = function() { 
    setTimeout(Binder(function(){ 
     this.foo("Lols"); 
    },this), 1000); 
}; 

ejemplo jsFiddle:

http://jsfiddle.net/ctrlfrk/6VaV6/

+0

Bueno, eso sin duda es un pequeño truco divertido, pero al leer el código siento que estoy de nuevo en C# vinculando de nuevo a delegados anónimos. Probablemente no valga la sobrecarga del rendimiento y la complejidad del código adicional solo para poder llamar a mi clase var "this". ¡A + por la creatividad, sin embargo! – Toji

Cuestiones relacionadas