Javascript 'this' überschreibt im Z-Kombinator und jeder anderen rekursiven Funktion
Hintergrund:
Ich habe eine rekursive Funktion implementiert von aZ-Kombinator wie gezeigtHier undHier so macht es keinen gebrauch vonarguments.callee
da es in naher Zukunft veraltet sein wirdES6.
Problem
Das Hauptproblem mit derZ-Kombinator und alle rekursiven anonymen Funktionen, die ich bisher gesehen habe, sind, dass sie de aktualisierenthis
Wert für den inneren Funktionsumfang (der selbst zurückgegebene amreturn
Klausel), so dass diethis
das verweist auf die oberste Ebene ist verloren, und ich möchte es durch alle inneren Funktionen beibehalten.
Gibt es eine Möglichkeit, das oberste Niveau zu halten?this
ohne es als zusätzliches Funktionsargument zu übergeben, was ist der naheliegendste Weg, um dieses Problem zu beseitigen, aber es ist nicht so sauber, wie ich es möchte?
BEARBEITEN:
Im Moment löse ich das Problem, indem ich die Spitze passierethis
Verweis auf dieZ-Kombinator so was:
Co.Utilities.Z(this.createHTMLFromLOM)(this.LOM, this);
In der rekursiven Funktion gebe ich die gleiche Funktion zurück, indem ich den oberen Wert wie folgt übergebe:
function createHTMLFromLOM(callee:any, LOM_section:LOM, self:any):void {
/* Some other code. */
return callee(LOM_section.children[widget], self);
}
Das ist meinZ-Kombinator Definition:
function Z(func:any):any {
var f = function () {
return func.apply(null, [f].concat([].slice.apply(arguments)));
};
return f;
}
Vielen Dank