AS3:这个'的背景是什么?在匿名函数?

时间:2014-05-21 21:13:20

标签: actionscript-3 this anonymous-function

在这个例子中:

    public function Roulette() {
        new QuickLoad(url, function (o:*):void {trace(this);});
    }

QuickLoad 实例执行其操作时,它会调用匿名函数。有人会认为 轮盘。但不,它原来是匿名函数的调用者, QuickLoad

这至少可以说是奇怪的,说我怎么能在里面传递“正确的” 这个 (即轮盘实例)匿名函数,如果我不这样做正常方式?

3 个答案:

答案 0 :(得分:2)

只需将外部this实例保存在其他名称下即可保留:

public function Roulette() {
    var rouletteThis = this;
    new QuickLoad(url, function (o:*):void {trace(rouletteThis);});
}

答案 1 :(得分:2)

有一种方法可以使用备用this指针调用函数,但由于您的函数是从new QuickLoad()内调用的,因此您需要更改那个调用语句,并将您的this作为轮盘传递给构造函数。您的新QuickLoad对象不知道其周围环境,甚至构造函数的调用者也不知道。因此,您需要了解它,将this指针从Roulette()传递到QuickLoad(),然后通过传递备用QuickLoad指针从this调用该函数

public function QuickLoad(url:String,caller:Object=null,callback:Function=null) {
    // initialization code
    if (callback!=null) {
        if (caller!=null) callback.apply(caller,[o]);
        else callback.apply(this,[o]);
    }
}
...
public function Roulette() {
    new QuickLoad(url, this, function (o:*):void {trace(this);});
}

Function::apply() manual

如果参数数组具有固定长度,也可以使用call()方法。 callback.call(caller,o);

答案 2 :(得分:1)

通常,在此上下文中,this指的是一个对象。引用一个相当臭名昭着的首字母缩略词:INABIAF(它不是一个bug,它是一个特色),LOL。所以,是的,调用该函数的对象实例QuickLoad将是this默认查看的内容。

我知道有一个例外(在很多人中,我确定)...你可以得到任何东西......变量,函数,对象,等等,通过这个["对象名称& #34]。但那是暂时的。

还有其他解决方法,我确定,这可能会或可能不适用于您的目的。这是传递函数的一种方式,在许多方面,它是我最常用的函数。

函数没有实例。他们不是对象。如果你想将一个函数作为参数发送到另一个函数,你只需传递它,如下面这个相当奇怪的例子。

//This function accepts a function as an argument.
function bridgeOfQuestions(person:String, response:Function):void
{
    if(person == "King Arthur")
    {
        response("What is the average airspeed velocity of an unladen swallow?");
    }
    else
    {
        response("What is your favorite color?");
    }
}

//This is the function we're going to pass.
function askQuestion(question:String):void
{
    trace(question);
}

//Here, we call bridgeOfQuestions and pass it the askQuestion function.
//NOTE: Leave off the parenthesis on the function being passed!
bridgeOfQuestions("Sir Lancelot", askQuestion);
bridgeOfQuestions("King Arthur", askQuestion);

编辑:如果只是名称您正在传递,则函数是永久性的函数。与对象不同,它不会改变,正如我所说,它没有实例。因此,如果您只想打印出该功能的名称,则只能使用trace("Roulette")