Javascript 'this' écrasant le combinateur Z et toutes les autres fonctions récursives

Contexte:

J'ai une fonction récursive mise en œuvre par un combinateur Z comme cela est montré ici et ici, donc il ne sert à rien de arguments.callee puisqu'il sera obsolète dans ES6 à venir.

  • Comment lier onclick handlers à `this` correctement sur React
  • Les rappels de Javascript perdent 'ceci'
  • Comment fonctionne.bind.bind (Function.call) uncurry?
  • Le contexte d'invocation (ceci) de l'appel de fonction forEach
  • Javascript "this" pointer dans la fonction imbriquée
  • Cette valeur dans JavaScript anonymous function
  • Problème

    Le problème principal avec le combinateur Z et toutes les fonctions anonymes récursives que j'ai vues jusqu'ici est qu'elles mettent à jour this valeur dans la portée de la fonction interne (la retournement automatique à la clause de return ), donc this qui fait référence au niveau supérieur Est perdu, et je veux le maintenir dans toutes les fonctions internes.

    Existe-t-il un moyen de maintenir le niveau supérieur sans le passer comme un argument de fonction supplémentaire, qui est le moyen le plus évident de se débarrasser de cette question mais n'est pas aussi propre que je le veux?

    MODIFIER:

    À l'heure actuelle, je résolve le problème en passant le haut de this référence au combinateur Z comme ceci:

     Co.Utilities.Z(this.createHTMLFromLOM)(this.LOM, this); 

    Dans la fonction récursive, je retourne la même fonction en passant le haut de cette valeur comme ceci:

     function createHTMLFromLOM(callee:any, LOM_section:LOM, self:any):void { /* Some other code. */ return callee(LOM_section.children[widget], self); } 

    C'est la définition de mon Z-combinator :

     function Z(func:any):any { var f = function () { return func.apply(null, [f].concat([].slice.apply(arguments))); }; return f; } 

    Merci

  • RequestAnimationFrame avec ce mot-clé
  • React.js et ES6: raison de ne pas lier une fonction dans le constructeur
  • Ceci est indéfini à l'intérieur de la fonction de flèche
  • Cette valeur dans JavaScript anonymous function
  • ES6 arrow function lexical this in V8
  • Les rappels de Javascript perdent 'ceci'
  • One Solution collect form web for “Javascript 'this' écrasant le combinateur Z et toutes les autres fonctions récursives”

    Vous pourriez faire ce qui suit:

    var me = this;

    Et le passe me comme un argument au Z Combinator.

    JavaScript rend le site Web intelligent, beauté et facile à utiliser.