我有一系列函数回调,如下所示:
class Blah {
private var callbacks : Array;
private var local : Number;
public function Blah() {
local = 42;
callbacks = [f1, f2, f3];
}
public function doIt() : Void {
callbacks[0]();
}
private function f1() : Void {
trace("local=" + local);
}
private function f2() : Void {}
private function f3() : Void {}
}
如果我运行此代码,我会得到“local = undefined”而不是“local = 42”:
blah = new Blah();
blah.doIt();
因此,Flash函数指针不带上下文。解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
尝试:
callbacks[0].apply(this, arguments array)
或
callbacks[0].call(this, comma-separated arguments)
如果你想“携带语境”,请尝试:
public function doIt() : Void {
var f1() : function (): Void {
trace("local=" + local);
}
f1();
}
这会按预期在this.local
上创建一个闭包
答案 1 :(得分:1)
最简单的方法是使用Delegate
类...它使用Vlagged描述的技术工作...虽然我必须修改,我根本不理解代码(它在语法上也是不正确的)...
否则,试试这个:
class AutoBind {
/**
* shortcut for multiple bindings
* @param theClass
* @param methods
* @return
*/
public static function methods(theClass:Function, methods:Array):Boolean {
var ret:Boolean = true;
for (var i:Number = 0; i < methods.length; i++) {
ret = ret && AutoBind.method(theClass, methods[i]);
}
return ret;
}
/**
* will cause that the method of name methodName is automatically bound to the owning instances of type theClass. returns success of the operation
* @param theClass
* @param methodName
* @return
*/
public static function method(theClass:Function, methodName:String):Boolean {
var old:Function = theClass.prototype[methodName];
if (old == undefined) return false;
theClass.prototype.addProperty(methodName, function ():Function {
var self:Object = this;
var f:Function = function () {
old.apply(self, arguments);
}
this[methodName] = f;
return f;
}, null);
return true;
}
}
并将其添加为Blah中的最后一个声明:
private static var __init = AutoBind.methods(Blah, "f1,f2,f3".split(","));
那就是诀窍......请注意,对f1,f2和f3的调用会变慢,因为它们需要一个额外的函数调用......
格尔茨
back2dos