C'è uno schema che viene spesso chiamato "Delega", che risolve questo problema.
in JavaScript, un'implementazione non troppo di fantasia potrebbe essere simile a questa:
/** class Delegate **/
var Delegate = function(thisRef, funcRef, argsArray) {
this.thisRef=thisRef;
this.funcRef=funcRef;
this.argsArray=argsArray;
}
Delegate.prototype.invoke = function() {
this.funcRef.apply(this.thisRef, this.argsArray);
}
/** static function Delegate.create - convenience function **/
Delegate.create = function(thisRef, funcRef, argsArray) {
var d = new Delegate(thisRef, funcRef, argsArray);
return function() { d.invoke(); }
}
Nel tuo esempio, si usa in questo modo:
this.b = function() {
Z(Delegate.create(this, this.c));
}
si potrebbe anche scrivere funzioni che si aspettano di ricevere un delegato:
function Z(d) {
d.invoke();
}
quindi, nel A
, il tuo impl di b
diventa:
this.b = function() {
var d = new Delegate(this, this.c);
Z(d);
SomeOtherFunc(d);
}
Il Delegate
fornisce solo un modo semplice, coerente di incapsulare il riferimento this
(che hai chiamato self
), all'interno di un'istanza di un oggetto che può essere affrontato come qualsiasi altro istanza di oggetto. È più leggibile e ti impedisce di dover inquinare l'ambito della tua funzione con variabili superflue come self
. Un'implementazione delegata più elaborata potrebbe avere i propri metodi e altri stati correlati. È anche possibile creare il delegato in modo tale da ridurre al minimo alcuni problemi di gestione della memoria relativi all'ambito (anche se il codice che ho mostrato qui non è sicuramente un esempio).
destro, in questo semplice esempio, non v'è alcuna ragione per il wrapper. Non dovrebbe essere difficile concepire un esempio in cui è necessario. (Modifica dei parametri, ecc.) Se non si avvolge, tuttavia, presumo che la chiusura sia passata come ci si aspetterebbe? –
senza il wrapper anonimo, 'c' viene chiamato con il riferimento' this' sbagliato. – Lee
@ Jonathan - Sì, corri, in tal caso vorrai passare una variabile proprio come se fossi in "self" che ti permetta di accedere a ciò che è nella chiusura. –