2017-03-22 13 views
1

Gibt es eine einfache Möglichkeit zu verhindern, $ bind Generation bei der Weitergabe von Klassenmember Funktionen?

Ich habe ein Objekt, das eine Funktion aufnimmt, die in einem beliebigen Intervall aufgerufen wird. Das Objekt bindet sich immer selbst als "diese" Bindung, bevor es die Funktion aufruft (dies geschieht auf der nativen Seite), daher ist der Aufruf an $ bind selbst unnötig. Allerdings kann ich keinen einfachen Weg finden zu verhindern, dass $ bind jedes Mal ausgegeben wird, wenn ich eine Elementfunktion nach Wert nehme.

Die einzige Möglichkeit, die ich gefunden habe, ist die Verwendung __js__ mit einem String-Literal der Mitgliedsfunktion Name, die ich lieber vermeiden würde ... Gibt es eine getippte Möglichkeit, dies zu tun? Oder etwas ein bisschen schöner? Eine Möglichkeit, immer noch die Syntax von haxe mit Bezeichnern anstelle eines String-Literals zu verwenden?

Beispiel:

private function onSpawn():Void 
{ 
    this.setAct(act); // Will generate JS: this.setAct($bind(this,this.act)); 
         // Id like to simply have it generate: this.setAct(this.act); 

    // Mitigated like this: 
    this.setAct(untyped __js__("this.act")); 
} 

private function act(dt:Float):Void 
{ 
    ... 
} 

Danke.

+0

Nicht sicher, ob es eine Methode gibt, außer den Generator (ocaml) zu modifizieren. Was genau ist das Problem mit $ bind? – KevinResoL

+0

$ bind fügt einen weiteren unnötigen Funktionsaufruf hinzu, wo er nicht benötigt wird. Ich benutze Javascript-Interpreter und diese Funktionen werden jedes Bild für viele Objekte genannt, was einen unnötigen Leistungseinbruch bedeutet. (Siehe https://github.com/svaarala/duktape/issues/1300#issuecomment-273003473). Nicht nur das, sondern auch $ bind fügt jedes Mal, wenn es aufgerufen wird, 3 Eigenschaften-Lookups hinzu, was ebenfalls langsam ist: ** f.method.apply (fscope, ..) ** –

Antwort

2

Sie verwenden Makro, um den untypisierten Ausdruck auszublenden, aber das ist ziemlich gefährlich. Jede Bezugnahme auf "dies" wird fehlschlagen.

http://try-haxe.mrcdk.com/#70ee4

Btw, ich glaube, der Compiler nicht $ binden erzeugen optimiert werden kann, wenn der Funktionscode nicht „das“ beinhaltet. Vielleicht möchten Sie ein Problem im Github-Repo dazu aufwerfen.

+0

Diese Lösung reicht für meine spezielle Situation. Sicherlich viel sauberer als meine derzeitige Problemumgehung. Habe vergessen, dass es andere Formen von Makros gab als Makros. :) Was deine Warnung betrifft 'diese' Bindung, verstanden - In meinem Fall wird der 'Akt' von der nativen Seite aufgerufen, die die 'diese' Bindung bereits auf das Objekt selbst setzt. Vielen Dank! –