在同一类中的 setTimeout 期间维护变量
Posted
技术标签:
【中文标题】在同一类中的 setTimeout 期间维护变量【英文标题】:Maintain variables during setTimeout within same class 【发布时间】:2015-12-01 14:26:09 【问题描述】:如何在没有类属性和其他变量失去范围并变得未定义的情况下调用 setTimeout? this question regarding variable scope with 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 返回未定义。如果我将 Function A_Closure 移动到非类 .as 文件中,一切正常且 MyVar = 10,但这似乎是一种非常老套的方法。有没有公认的方法在类中使用 setTimeout?
对于这个项目,我仅限于使用 AS2(CryEngine 中的 Scaleform)。
谢谢。
【问题讨论】:
【参考方案1】:如果您想以 AS2 方式执行此操作,则调用函数同时保持它们“链接”到实例变量的解决方案是使用 Delegate。
您的 setTimeout 行将更改为如下所示:
setTimeout(Delegate.create(this, FunctionC), 1000);
我自己从未使用过 scaleform,但 documentation 表明 Delegate 在库中可用 gfx.utils.Delegate
,这与 Adobe 版本不同,但调用看起来相同。
代表不是魔术。通过创建一个带有参数的函数,该函数创建另一个使用这些参数的函数,您在调用第一个函数时“存储”了这些参数。 (重要的部分是函数必须在另一个函数中定义,而不仅仅是调用)。这可能是您在 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);
所有代码均来自内存,我没有测试,所以可能会有错误。
【讨论】:
您好,感谢您的建议,并对延迟回复表示歉意。 Delegate 方法可以很好地调用函数并保留变量,但不幸的是 setTimeout 似乎失去了它的时间参数并立即执行,无论提供什么值。我已经搜索了一段时间来寻找一个示例,该示例显示了一个带有 setTimout 的委托,但空手而归。你有例子吗? 看起来您不小心调用了该函数,而不是将引用传递给该函数。您是否在创建委托时使用了“FunctionC”,而不是意外地使用了“FunctionC()”?后者是函数的调用,而前者只是对函数的引用——引用就是你需要的。 是的,我是在调用而不是传递引用。问题已解决,再次感谢。【参考方案2】:尝试将“this”存储在调用函数的闭包中,这样它就不会复制 myvar。
示例。
function a()
var scope:MyClass = this;
setTimeout(function()
scope.MyVar = 0; // this should hit the actual value of the class
, 1000);
【讨论】:
以上是关于在同一类中的 setTimeout 期间维护变量的主要内容,如果未能解决你的问题,请参考以下文章