我对 ActionScript 很陌生,但对面向对象或一般的过程语言都不是新手。但是,ActionScript 对这两个类别的功能的特殊组合让我感到困惑。
具体来说,我对ExternalInterface.addCallback()的机制感到困惑。方法签名是:
public static function addCallback(functionName:String, closure:Function):void
特别感兴趣的是闭包参数,它具有以下文档:
closure:Function — 要调用的函数闭包。这可能是一个独立的函数,也可能是一个引用对象实例方法的方法闭包。通过传递方法闭包,您可以将回调指向特定对象实例的方法。
我认为上面的意思是闭包只是一个函数(不是方法),它可能是也可能不是包含来自实例化对象的方法调用的闭包。所以当我看到这样的代码(取自同一个文档页面)时,我会感到困惑:
public class ext_test extends Sprite {
function ext_test():void {
ExternalInterface.marshallExceptions = true;
ExternalInterface.addCallback("g", g);
try {
ExternalInterface.call("throwit");
} catch(e:Error) {
trace(e)
}
}
function g() { throw new Error("exception from actionscript!!!!") }
}
上面的代码插入了 to addCallback
,一个非静态方法,ext_test
没有将它包装在一个包含实例化ex_test
对象的闭包中。
该方法包含一些琐碎的代码,但如果它有包含成员变量等的语句怎么办?当没有父对象时如何评估该方法?
此外,(因为addCallback
似乎允许传递任意方法)文档没有提及访问修饰符对传递的方法(如果有)的影响。如果我将方法标记为私有,我仍然可以将它传递给 addCallback 吗?这是怎么回事?
如果有人能帮我解决这个问题,我将不胜感激。