Flash 在同一类内的setTimeout期间维护变量
在没有类属性和其他变量失去作用域并变得未定义的情况下,如何调用setTimeout?答案是使用函数闭包,以便在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
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()”?后者是对函数的调用,前者只是对函数的引用-引用就是您需要的引用。是的,我是在调用而不是传递引用。问题解决了,再次感谢。