Frage

Dieser Verschluss funktioniert:

var o = {
    foo: 5
};

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

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

ist es möglich, Handler in-line zu definieren, vielleicht mit etwas ähnlichem zu einem y-combinator Betrieb?

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

aus akademischer Neugier, ich versuche nicht, diesen Code in der Produktion zu tun

Intro zur y-combinator

War es hilfreich?

Lösung

Nein, das ist nicht möglich, da zum Zeitpunkt der Definition des Objektliteral, die Variable o ist nicht definiert, und der this Bezug zum Zeitpunkt der Definition nicht Bezug o.

Wenn Sie einen temporären Bezug auf this in der äußeren Funktion und gaben sie in den Verschluss, es würde funktionieren, aber Sie würden nicht in der Lage sein, in einem Objekt übergeben Sie die foo Eigenschaft, um aus.

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

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

Andere Tipps

Dies ist nicht möglich mit einem Objektliteral von selbst , wie andere haben darauf hingewiesen. Allerdings kann der Prozess gewickelt werden. Ob oder nicht „alles fügt“, ist fraglich. Dies ist nicht das gleiche wie ein Y-Combinator (vielleicht die Hälfte davon?), Weil es nicht versucht, einen „rekursive Namen“ zu geben (soweit ich das sagen kann, Y-Kombinatoren nehmen erstklassige Funktionen und Verschlüsse oder eine Art und Weise zu simulieren, so).

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)
    }
  }
})

Nicht-geprüft, sondern zeigt einen Ansatz, dass könnte entnommen werden. Es gibt subtile Probleme mit diesem und eine Prototypkette auf dict / res, falls vorhanden -. Eine Übung für den Leser

Happy-Codierung.

Sie könnten nur das this Schlüsselwort hier:

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

Das ist viel einfacher Ansatz ... Eigentlich Ihr Ansatz auch gar nicht möglich ist, da o nicht definiert ist, wenn Sie sich darauf beziehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top