2015-08-28 1 views
0

Вот очень упрощенная версия моего проекта.Свойство класса потеряет область И не может быть установлено после setTimeout

У меня есть файл класса:

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 еще Undefined:

function DoStuffMethod(){ 

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


myNumberStoredInClass = 10; 

    trace(myNumberStoredInClass); // returns Undefined 
}; 

Я попытался с помощью this.myNumberStoredInClass в DoStuffMethod, но результат тот же. Я просто не могу установить или получить переменную! Если я делаю трассировку сразу после setTimeout, это значение существует, но после запуска setTimeout значение не может быть установлено.

Я должен использовать AS2 для этого.

Любые идеи? Большое спасибо.

EDIT: Пробовал добавлять объект к вызову setTimeout в соответствии с документацией, предложенной Sant gMirian, но все тот же результат.

+0

Это проблема SetTimeout сфера, смотрите здесь, это setInterval страница, но сфера SetTimeout работает одинаково http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000600.html – gMirian

+0

Благодарю. Пробовал добавлять объект к аргументам, но по-прежнему не может изменить переменную из Undefined. Не могли бы вы разместить пример с моим кодом, если бы у меня не было синтаксиса? – Absinthe

+0

К сожалению, у меня нет Flash CS6 для проверки кода, поэтому можно дать просто предложение, попытаться сделать переменную и функцию static, например. статическая публичная функция DoStuffMethod() и static public var myNumberStoredInClass: Number; – gMirian

ответ

0

Закрытие должно работать. Код:

setTimeout(MyClass.DoStuffMethod, 7500); 

становится:

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

Кстати, я предполагаю, что MyClass является экземпляром своего класса, а не ваше определение класса.

Это должно работать:

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

где haveStuffDone есть функция, определенная в том же контексте, вы называете SetTimeout с.

Надеюсь, это поможет.

+0

Большое спасибо, что хорошо работает.После прочтения закрытий я не понимаю, как это работает, в частности: в моем исходном коде все свойства класса потеряли область после setTimeout. Закрытие гарантирует, что переменные, доступные для «внешней» функции, доступны для «внутреннего» ... но что это касается моего класса? Это потому, что функция закрытия сохраняет объем членов класса во время вызова setTimeout? Еще раз спасибо. – Absinthe

+0

Закрытие «заморозит» область, доступную им при их объявлении. Посмотрите на эту страницу: [as3-основы/функции] (http://www.adobe.com/devnet/actionscript/learning/as3-fundamentals/functions.html) и выполните поиск ** Функция замыкания ** - раздел находится в нижней части текста. Текст ссылается на отсутствующий пример, хотя :-( –

+0

Отличная ссылка, спасибо. Для кого-то еще интересно об этом, я подумал, что эта строка с этой страницы прекрасно подводит итог: «Закрытие функции - это объект, содержащий моментальный снимок функции и его лексическая среда. Лексическая среда функции включает в себя все переменные, свойства, методы и объекты в цепочке видимости функции вместе со своими значениями ». – Absinthe