【问题标题】:Class property looses scope AND can't be set after setTimeout类属性失去作用域并且在 setTimeout 之后无法设置
【发布时间】:2015-11-23 01:36:11
【问题描述】:

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

我有一个类文件:

class MyClass{

public var myNumberStoredInClass:Number;

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

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

}; // end class

我有一个普通的 .as 文件,我可以从中访问 this.myNumberStoredInClass 而 MyClass.myNumberStoredInClass 没有问题,直到我为类中的方法调用 setTimeout:

function ASFileFunction(){

    trace(MyClass.myNumberStoredInClass); // works fine

    setTimeout(MyClass.DoStuffMethod, 7500);

};

当在类文件中触发 DoStuffMethod 时,myNumberStoredInClass 的跟踪返回“未定义”。我已经在 .as 文件中的许多其他函数中使用了该值,但在 setTimeout 之后它就丢失了。

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

function DoStuffMethod(){

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


myNumberStoredInClass = 10; 

    trace(myNumberStoredInClass); // returns Undefined
};

我尝试在 DoStuffMethod 中使用 this.myNumberStoredInClass 但结果是一样的。我只是无法设置或检索变量!如果我在 setTimeout 之后立即进行跟踪,则该值就在那里,但是一旦 setTimeout 触发,则无法设置该值。

为此我必须使用 AS2。

有什么想法吗?非常感谢。

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

【问题讨论】:

  • 这是setTimeout范围的问题,看这里,是setInterval页面,但是setTimeout的范围是一样的help.adobe.com/en_US/AS2LCR/Flash_10.0/…
  • 谢谢。尝试将对象添加到参数中,但仍然无法更改未定义的变量。如果我的语法不正确,您介意用我的代码发布一个示例吗?
  • 不幸的是我没有 Flash CS6 来测试代码,所以只能给出建议,尝试使变量和函数静态,例如静态公共函数 DoStuffMethod() 和静态公共 var myNumberStoredInClass:Number;
  • 将变量更改为静态有效,非常感谢。我不知道这是为什么?您想将其作为答案发布,以便我将其标记为已解决吗?

标签: flash actionscript scope actionscript-2 flash-cs5


【解决方案1】:

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

 setTimeout(MyClass.DoStuffMethod, 7500);

变成:

 setTimeout(function () { MyClass.DoStuffMethod() }, 7500);

顺便说一句,我假设 MyClass 是你的类的一个实例,而不是你的类定义。

这也应该有效:

function haveStuffDone () : void {
    MyClass.DoStuffMethod();
}
setTimeout (haveStuffDone, 7500);

其中 haveStuffDone 是在您调用 setTimeout 的同一上下文中定义的函数。

希望这会有所帮助。

【讨论】:

  • 非常感谢,效果很好。在阅读了闭包之后,我不明白它是如何工作的,特别是:在我的原始代码中,所有类属性在 setTimeout 之后都失去了作用域。闭包确保“外部”函数可用的变量对“内部”函数可用......但这与我的类有什么关系?是因为闭包函数在 setTimeout 调用期间保留了类成员的范围吗?再次感谢。
  • 闭包在声明它们时“冻结”它们可用的范围。看看这个页面:as3-fundamentals/functions,然后搜索 Functionclosures — 该部分位于文本的底部。文本指的是一个缺失的例子,虽然:-(
  • 很好的链接,谢谢。对于其他对此感到疑惑的人,我认为该页面中的这一行很好地总结了它:“函数闭包是一个包含函数及其词法环境的快照的对象。函数的词法环境包括所有变量、属性、方法、和函数作用域链中的对象,以及它们的值。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2013-04-03
  • 2020-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多