2011-01-27 15 views
5

Questo è più di un controllo di integrità che altro. Ho scoperto che quando si lavora con le chiusure in JavaScript Io uso spesso il seguente schema per accedere alla classe racchiude all'interno della funzione:Accesso a "questo" nella chiusura Javascript

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

Ovviamente questo funziona bene, e non è nemmeno una grande seccatura per lavorare con . C'è solo questo piccolo prurito nella parte posteriore del mio cervello che dice 'Stai facendo questo troppo complicato, manichino!' È questo il modello comunemente accettato?

risposta

6

Questo è il modello comunemente accettato con l'eccezione che è spesso utilizzato that anziché self.

+0

Buono a sapersi . Avevo appena scelto ciò che mi era familiare. :) (Grande fan di Python!) – Toji

4

Si può tirare un subdolo utilizzando una funzione di legame come questo:

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

e quindi cambiare la vostra chiamata a

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

esempio jsfiddle:

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

+0

Beh, quello è sicuramente un piccolo trucco divertente, ma leggendo il codice mi sento come se fossi di nuovo in C# vincolante ancora per i delegati anonimi! Probabilmente non vale l'overhead delle prestazioni e la complessità del codice extra solo per poter chiamare la mia classe var "this". A + per la creatività, però! – Toji

Problemi correlati