Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 类属性失去了作用域,可以';设置超时后无法设置_Flash_Actionscript_Scope_Actionscript 2_Flash Cs5 - Fatal编程技术网

Flash 类属性失去了作用域,可以';设置超时后无法设置

Flash 类属性失去了作用域,可以';设置超时后无法设置,flash,actionscript,scope,actionscript-2,flash-cs5,Flash,Actionscript,Scope,Actionscript 2,Flash Cs5,这是我的项目的一个非常简化的版本 我有一个类文件: class MyClass{ public var myNumberStoredInClass:Number; // constructor function MyClass(myNumber:Number){ this.myNumberStoredInClass = myNumber; }; // some method function DoStuffMethod(){ trace(this.myNumberStore

这是我的项目的一个非常简化的版本

我有一个类文件:

class MyClass{

public var myNumberStoredInClass:Number;

// constructor
function MyClass(myNumber:Number){
    this.myNumberStoredInClass = myNumber;
};

// some method
function DoStuffMethod(){
    trace(this.myNumberStoredInClass);
};

}; // end class
我有一个普通的.as文件,在调用该类中某个方法的setTimeout之前,我可以从该文件访问此.myNumberStoredClass,而MyClass.myNumberStoredClass没有问题:

function ASFileFunction(){

    trace(MyClass.myNumberStoredInClass); // works fine

    setTimeout(MyClass.DoStuffMethod, 7500);

};
在类文件中触发DoStuffMethod时,MyNumberStoredClass的跟踪返回“Undefined”。我在.as文件的许多其他函数中都使用了该值,但在setTimeout之后,它就丢失了

真正奇怪的是,我可以将DoStuffMethod更改为以下内容,而MyNumberStoredClass仍然没有定义:

function DoStuffMethod(){

// I've tried watching this in debug mode and it just won't set, remains Undefined


myNumberStoredInClass = 10; 

    trace(myNumberStoredInClass); // returns Undefined
};
我尝试在dostuff方法中使用this.myNumberStoredInClass,但结果相同。我就是无法设置或检索变量!如果我在setTimeout之后立即进行跟踪,则该值存在,但一旦启动setTimeout,则无法设置该值

为此,我必须使用AS2

有什么想法吗?非常感谢


编辑:尝试按照Sant gMirian建议的文档将对象添加到setTimeout调用中,但结果仍然相同。

闭包应该可以工作。您的代码:

 setTimeout(MyClass.DoStuffMethod, 7500);
变成:

 setTimeout(function () { MyClass.DoStuffMethod() }, 7500);
顺便说一下,我假设MyClass是类的实例,而不是类定义

这也应该起作用:

function haveStuffDone () : void {
    MyClass.DoStuffMethod();
}
setTimeout (haveStuffDone, 7500);
其中haveStuffDone是在调用setTimeout的同一上下文中定义的函数


希望这能有所帮助。

这是setTimeout作用域的问题,请看这里,这是setInterval页面,但setTimeout的作用域工作原理相同,谢谢。已尝试将对象添加到参数中,但仍无法将变量从“未定义”更改为“未定义”。如果我没有正确的语法,你介意用我的代码发布一个例子吗?不幸的是,我没有Flash CS6来测试代码,所以可以给出一些建议,尝试使变量和函数保持静态,例如静态公共函数DoStuffMethod()和静态公共变量myNumberStoredInClass:Number;将变量更改为static有效,非常感谢。我想知道这是为什么?你想发布一个答案,这样我就可以标记它解决了吗?非常感谢,效果很好。在阅读了闭包之后,我不明白它是如何工作的,特别是:在我的原始代码中,所有的类属性在setTimeout之后都失去了作用域。闭包确保可用于“外部”函数的变量可用于“内部”函数。。。但这和我的课有什么关系?是否因为闭包函数在setTimeout调用期间保留了类成员的作用域?再次感谢。闭包在声明时“冻结”了它们可用的范围。请查看此页面:,并搜索函数闭包-该部分位于文本的底部。但是,本文引用了一个缺少的示例:-(非常好的链接,谢谢。对于其他对此感到疑惑的人,我认为该页面的这一行很好地总结了它:函数闭包是包含函数及其词法环境快照的对象。函数的词法环境包括函数作用域链中的所有变量、属性、方法和对象及其值