我是ActionScript的新手,但对于面向对象或过程语言来说并不陌生。但是,ActionScript特定的两个类别的功能组合使我感到困惑。
具体来说,我对ExternalInterface.addCallback()的机制感到困惑。方法签名是:
public static function addCallback(functionName:String, closure:Function):void
特别感兴趣的是closure参数,它包含以下文档:
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!!!!") }
}
上面的代码插入addCallback
,ext_test
的非静态方法,而不将其包含在包含实例化ex_test
对象的闭包中。
该方法包含简单的代码,但是如果它包含包含成员变量的语句等呢?当没有父对象时,如何评估方法?
此外,(因为addCallback
似乎允许传递任意方法)文档没有提及访问修饰符对传递方法的影响(如果有的话)。如果我将方法标记为私有,我还能将它传递给addCallback吗?这是什么交易?
如果有人能帮助我解决这个问题,我会很感激。
答案 0 :(得分:2)
如果您关注的是知道您传递的方法将在何种上下文中执行,那么这只是您附加它的上下文。
doc的jibber jabber只是意味着AS3和运行时中有几种功能。 “独立”功能是指您通常称之为匿名功能的功能 - 它仍然保留了定义它们的上下文:
var anonymous:Function = createAnonymous();
trace(anonymous()); // 123
function createAnonymous():Function {
var internalStuff:Number = 123;
var func:Function = function():Number {
return internalStuff;
}
return func;
}
方法闭包是类的方法的实例,对象是这些类的实例。因此,当您将方法闭包传递给ExternalInterface.addCallback()
时,您将在调用它时对上下文(即成员变量)安全。
答案 1 :(得分:0)
Woops。在我看到的所有示例中完全忘记了这一点,addCallback
正在构造函数的上下文中执行,因此传递给它的方法引用具有要在其下执行的上下文。
因此,访问修饰符并不重要,因为类中的所有内容都可以被类看到。