2017-03-22 157 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'绑定到对象本身已经。谢谢! –