Question

cette fermeture fonctionne:

var o = {
    foo: 5
};

o.handler = function(obj){
    return function() {
        alert(obj.foo);
    };
}(o);

o.handler(); //alert('5')

est-il possible de définir gestionnaire en ligne, peut-être quelque chose de semblable à une opération y combinateur?

var o = {
    foo: 5,
    handler: function(obj){
        return function() {
            alert(obj.foo);
        };
    }(o); //pointer to o? -----------------------------
};

par curiosité académique, je ne cherche pas à le faire dans le code de production

intro de la y-combinateur

Était-ce utile?

La solution

Non, cela est impossible, car au moment de la définition du littéral d'objet, la o variable est non définie, et la référence this au moment de la définition ne o de référence.

Si vous avez utilisé une référence temporaire this dans la fonction extérieure et transmit dans la fermeture, cela fonctionnerait, mais vous ne seriez pas en mesure de passer dans un objet pour obtenir la propriété foo sur.

var o = {
    foo: 5,
    handler:function(){
        var self = this;
        return function() {
            alert(self.foo);
        };
    }
};

var h = o.handler();
h();

Autres conseils

Ceci est impossible avec un objet littéral par lui-même , comme d'autres l'ont souligné. Cependant, le processus peut être enroulé. Ou non wether « ajoute quelque chose » est discutable. Ce n'est pas la même que celle d'un Y-Combinator (peut-être la moitié?), Parce qu'il ne cherche pas à donner un « nom récursive » (pour autant que je peux dire Y Combinators assumer les fonctions de première classe et des fermetures ou un manière à simuler les).

function bindMany (dict, res) {
  res = res || {}
  for (var k in dict) {
    if (dict.hasOwnProperty(k)) {
      var v = dict[p]
      res[k] = v instanceof Function ? v(res) : v
    }
  }
  return res
}

var o = bindMany({
  foo: 5,
  handler: function(obj){
    return function() {
      alert(obj.foo)
    }
  }
})

Non-testé, mais montre une approche qui pourrait prendre. Il y a des questions subtiles avec cela et une chaîne de prototype sur dict / res, le cas échéant -. Un exercice pour le lecteur

Happy codage.

Vous pouvez simplement utiliser le mot-clé this ici:

var o = {
    foo: 5,
    handler: function() {
      alert(this.foo);
    }
};

C'est beaucoup plus facile approche ... En fait, votre approche est même pas possible, car o n'est pas défini lorsque vous faites référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top