0

我对 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 吗?这是怎么回事?

如果有人能帮我解决这个问题,我将不胜感激。

4

2 回答 2

2

如果您关心的是知道您传递的方法将在什么上下文中执行,这只是您附加它的上下文。

文档中的jibber jabber 简单的表示AS3 和runtime 中有几种函数。“独立”函数是指您通常所说的匿名函数 - 它仍然保留定义它们的上下文:

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(),您将在调用它时对上下文(即成员变量)是安全的。

于 2013-01-20T21:42:58.687 回答
0

哎呀。完全忘记了在我见过的所有示例中,addCallback都是在构造函数的上下文中执行的,因此传递给它的方法引用具有要在其下执行的上下文。

因此,访问修饰符无关紧要,因为类中的所有内容都可以被类看到。

于 2013-01-20T17:25:49.913 回答