2017-03-22 14 views
1

簡単な方法はありますか?$ bindは、クラスメンバー関数を渡すときに生成されますか?

私は、任意の間隔で呼び出される関数をとるオブジェクトを持っています。関数は(これはネイティブ側で行われます)関数を呼び出す前にオブジェクトを常に 'this'バインディングとしてバインドします。したがって、$ bindへの呼び出し自体は不要です。しかし、私は単純な方法を見つけることができないようです$ bind私は値でメンバー関数を取得するたびに放出されることから。

私が見つけた唯一の方法は、__js__に、メンバ関数名の文字列リテラルを使用することです。これは、むしろ避けるでしょう。型付きの方法がありますか?それとももう少し良いものがありますか?文字列リテラルの代わりにhaxe構文w/identifierを使用する方法?

例:

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 
{ 
    ... 
} 

ありがとうございました。

+0

ジェネレータ(ocaml)の変更以外の方法があるかどうかは不明です。 $ bindを使用した場合の正確な問題は何ですか? – KevinResoL

+0

$ bindは不要な関数呼び出しを追加します。私はJavaScriptインタープリタを使用しています。これらの関数は多くのオブジェクトのすべてのフレームと呼ばれ、不必要なパフォーマンスが低下します。 (https://github.com/svaarala/duktape/issues/1300#issuecomment-273003473を参照)。それだけでなく、$ bindはそれが呼び出されるたびに3つのプロパティールックアップも追加します。** f.method.apply(f.scope、..)** –

答えて

2

マクロを使用して型なしの式をマスクしますが、これは非常に危険です。 "this"への参照はすべて失敗します。

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

ところで、私は、機能コードが「これを」必要としない場合、コンパイラは$バインドを生成しないように最適化することができると思います。それについてのgithubリポジトリに問題を提起したいかもしれません。

+0

この解決策は私の特定の状況には十分です。確かに私の現在の回避策よりもはるかにクリーンです。ビルドマクロよりも他の形式のマクロがあるのを忘れてしまった。あなたの警告については、このバインディングは理解されています - 私の場合、 'act'はオブジェクト自体にバインドされている 'this'を設定しているネイティブ側から呼び出されています。ありがとうございました! –

関連する問題