在相同 class 的 setTimeout 期间维护变量

Maintain variables during setTimeout within same class

如何在 class 属性和其他变量失去范围并变得未定义的情况下调用 setTimeout? 的答案是使用函数闭包,因此在 setTimeout 期间获取并维护范围内变量的 'snapshot'。但是,这似乎在 class 中不起作用。例如

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

此 returns 未为 MyVar 定义。如果我将 Function A_Closure 移动到非 class .as 文件,一切正常并且 MyVar = 10,但这似乎是一种非常 hacky 的方法。在 class 中是否有公认的使用 setTimeout 的方法?

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

谢谢。

如果您想以 AS2 方式执行此操作,那么在将函数 'linked' 保留为实例变量的同时调用函数的解决方案是使用 Delegate.

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

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

我自己从未使用过 scaleform,但 documentation 表明 Delegate 在库中可用 gfx.utils.Delegate,这与 Adob​​e 版本不同,但调用看起来相同。

代表没有魔法。通过创建一个带有参数的函数,该函数创建另一个使用这些参数的函数,当您调用第一个函数时,您就是 'storing' 这些参数。 (重要的是该函数必须在另一个函数中 定义 ,而不仅仅是 调用 )。这可能是您在 A_Closure 函数中尝试做的。

伪代码基于在 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);
}