Глюк Flash ActionScript с методом setTimeout()
Сегодня потерял минут 20, пытаясь понять почему “не едут лыжи”.
Решения так и не нашел. Гугл также по этому поводу молчит.
Итак, код FLA-файла (ActionScript 2.0), в первом кадре:
import foo;
var foo1 = new foo();
Код внешнего файла foo.as:
class foo {
function foo() {
setTimeout(this.bar, 1000);
}
function bar() {
trace(’foo.bar called’);
}
}
Думаете, это работает? Хрена-с два! Компилятор выдает ошибку:
foo.as, Line 4 / There is no method with the name ’setTimeout’. / setTimeout(this.bar, 1000);
Почему-то компилятор, вместо того, чтбы найти имя “setTimeout” в списке глобальных функций, упорно считает, что я пытаюсь сделать вызов this.setTimeout().
Что примечательно, если использовать setInterval() вместо setTimeout(), то все прекрасно работает.
Также, если писать plain-код, без использования класса - все также прекрасно работает (и с setTimeout()).
Подпереть можно вот так:
class foo {
function foo() {
with (this) {
setTimeout(this.bar, 1000);
}
}
function bar() {
trace(’foo.bar called’);
}
}
Тогда все работает.
Эй, флэшеры? Есть мысли? Это баг флэша или я сегодня просто мало поспал?
P.S.: пришлось тупо подпереть с помощью with.

3eka сказал(а):
Ща еще покопал документацию.
Можно написать:
_global.setTimeout()
Т.е. явно указать, что setTimeout() - это метод суперглобального объекта _global.
Но бага это не объясняет.
Link | Декабрь 4th, 2008 at 13:46
Kasper пошутил(а):
Всречался с такой батвой, обходил явным указанием суперглобальности метода (_global.funcName)
Link | Декабрь 4th, 2008 at 14:09
tzar подумал(а):
пока читал подумал, что можно попробовать что-то такое типа:
_root.setTimeout();
ведь _root это тоже объект самого высокого уровня и функция setTimeout() доступна именно на нем. Хотя т.к. foo является объектом нижнего уровня и в нем не переопределен этот метод, то он должен был его унаследовать.
Link | Декабрь 4th, 2008 at 15:05
Kasper облек(ла) свое умозаключение в форму комментария:
_root это не самый высокий уровень, к примеру следующий скрипт
_root.testVar = ‘ROOT’;
_global.testVar = ‘GLOBAL’;
trace(testVar);
выведет Root
а если закомментить первую строчку:
//_root.testVar = ‘ROOT’;
_global.testVar = ‘GLOBAL’;
trace(testVar);
то Global
То есть флешь начинает искать от локальной области видимости до глобальной, причем _global обособленная область видимости следующая за _root.
Link | Декабрь 4th, 2008 at 15:15
Kasper пошутил(а):
странно другое, флешь не видит _global методов без явного указание на глобальность метода изнутри создаваемого класса
Link | Декабрь 4th, 2008 at 15:17
Kasper пошутил(а):
мдя..как-то уж повелось у меня..флешь :) впредь буду говорить влещь..
Link | Декабрь 4th, 2008 at 15:19
tzar отморозил(а):
ага. вот я об этом же. странно, что не подхватилась функция.
Link | Декабрь 4th, 2008 at 16:18