2017-03-22 154 views
1

有沒有簡單的方法來防止$ bind代傳遞類成員函數?Haxe Javascript:防止'綁定'代?

我有一個對象,它接受一個將在任意時間間隔內調用的函數。對象在調用函數之前總是將自己綁定爲'this'綁定(這是在本地完成的),因此對$ bind的調用本身是不必要的。然而,我似乎無法找到一種簡單的方法來防止$ bind被任何時候按值獲取成員函數時發出。

我發現的唯一方法是使用__js__與成員函數名稱的字符串字面量,我寧願避免...有沒有類型的方式來這樣做?或者更好一點?一種仍然使用haxe語法的方法(帶標識符而不是字符串文字)?

例子:

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

這個解決方案對於我的特殊情況已經足夠了。當然,比我目前的解決方法更清潔。忘記還有其他形式的宏而不是構建宏。 :)至於你的警告'這個'綁定,理解 - 在我的情況'行爲'是從本地調用'this'綁定到對象本身已經。謝謝! –