Flash 在同一类内的setTimeout期间维护变量

Flash 在同一类内的setTimeout期间维护变量,flash,actionscript,scope,settimeout,actionscript-2,Flash,Actionscript,Scope,Settimeout,Actionscript 2,在没有类属性和其他变量失去作用域并变得未定义的情况下,如何调用setTimeout?答案是使用函数闭包,以便在setTimeout期间获取并维护范围内变量的“快照”。然而,这在一个类中似乎不起作用。比如说 class MyClass public var MyVar:Number; Function A_Closure(){ FunctionC(); }; Function B(){ MyVar = 10; setTimeout(A_Closure, 1000

在没有类属性和其他变量失去作用域并变得未定义的情况下,如何调用setTimeout?答案是使用函数闭包,以便在setTimeout期间获取并维护范围内变量的“快照”。然而,这在一个类中似乎不起作用。比如说

class MyClass

public var MyVar:Number;

Function A_Closure(){
     FunctionC();
};

Function B(){
     MyVar = 10;
     setTimeout(A_Closure, 1000);
};

Function C(){
     trace("MyVar = " + MyVar); // returns Undefined
};

}; // End class
这将返回MyVar的未定义值。如果我将函数A_闭包移动到一个非class.as文件,那么一切都正常,MyVar=10,但这似乎是一种非常有技巧的方法。是否有一种公认的方法在类中使用setTimeout

对于这个项目,我只能使用AS2(CryEngine中的Scaleform)


谢谢。

如果您想以AS2方式执行此操作,那么在保持函数与实例变量“链接”的同时调用函数的解决方案将是使用一个

您的setTimeout行将更改为如下所示:

setTimeout(createClosure(this), 1000);
setTimeout(Delegate.create(this,FunctionC),1000)

我自己从未使用过scaleform,但建议的委托在库中作为
gfx.utils.Delegate
提供,这与Adobe版本不同,但调用看起来相同

代表不是魔术。通过创建一个带有参数的函数来创建另一个使用这些参数的函数,您在调用第一个函数时正在“存储”这些参数。(重要的部分是函数必须在另一个函数中定义,而不仅仅是调用)。这可能是您在
A_闭包
函数中尝试执行的操作

Psuedocode基于在javascript中的实现方式:

   function createClosure(obj) {
      return function () {
          // this if not a 'universal' solution like Delegate
          // because it calls this specific function
          obj.FunctionC();
      }
   };
现在,您应该将setTimeout()函数更新为如下内容:

setTimeout(createClosure(this), 1000);
所有代码都来自内存,我没有测试它,所以可能会出错。

尝试将“this”存储在调用函数的闭包中,这样它就不会复制myvar

例如

function a() {
    var scope:MyClass = this;
    setTimeout(function() {
        scope.MyVar = 0;  // this should hit the actual value of the class
    }, 1000);
}

您好,谢谢您的建议,并对延迟回复表示歉意。Delegate方法在调用函数和保留变量方面表现出色,但不幸的是setTimeout似乎失去了它的time参数&不管提供什么值,它都会立即执行。我已经搜索了一段时间,以获取一个示例,该示例显示了一个具有setTimout的代理,但结果却是空手而归。您有任何示例吗?看起来您不小心调用了该函数,而没有将引用传递给该函数。您是否在创建委托时使用了“FunctionC”,而不是意外地使用了“FunctionC()”?后者是对函数的调用,前者只是对函数的引用-引用就是您需要的引用。是的,我是在调用而不是传递引用。问题解决了,再次感谢。