Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Не видно глобальной переменной из мувика (http://www.flasher.ru/forum/showthread.php?t=78269)

iNils 14.04.2006 12:19

Смотрим
Код:

// код 1
_global.glob = 10;
// код 2
trace (_global.glob + " " + glob);
// код 3
glob = 300;
// код 4
trace (_global.glob + " " + glob);
// код 5
delete glob
// код 6
trace (_global.glob + " " + glob);

получаем
10 10
10 300
10 10
Почему так происходит:
Сначала мы создаем глобальную переменую [1], при попытке вывести просто glob [2] флеш ищет по цепочке вверх и находит переменую в _global. Когда присваеваем новое значение [3], то мы на самом деле создаем новую переменную в таймлайне, поэтому при попытке вывести просто glob [4] флеш не идет вверх, так как находит имя переменной в таймлайне. Это легко проверить заглянув в дебаггер. Там найдете одну переменную в _global, а одну в _level0. Теперь удалим просто glob [5] и увидим что при его попытке вывести, флеш опять не находит его в таймлане и идет выше до _global.

Почему
Код:

// код 1
_global.glob=5
// код 2
_global.glob = glob++;
trace (_global.glob + " " + glob);

выдает 5 6

Мы создаем глобальную переменную [1], а потом, по аналогии с тем что я писал выше, опять создаем новую переменную в таймлане [2], но varible++ это постфиксное инкременирование, то есть сначала мы используем переменную, а уж потом ее увеличиваем на 1. Поэтому _global.glob получает значение glob (которая еще пока береться из _global), а потом создается таймлайновый glob с увеличенным значением. Поэтому надо использовать префисное инкременирование ++varible. Тогда _global.glob и glob будут равны.

Хотя зачем делать _global.glob=++glob тоже не ясно. Можно ведь сделать _global.glob++ :)

Whatsername 14.04.2006 13:35

iNils,
про цепочку области видимости переменной и постфиксное инкрементирование ты хорошо рассказал. Спасибо : )

Но удивительно другое.
Код:

// измененный вариант первой строчки твоего кода про _global
//
var x;
var y;
//
x = y++;
trace(x); // undefined (!)

// Как это должно работать:
// Переменная y имеет значение undefined.
// При использовании в числовом контексте (см. оператор инкрементирования)
// значение автоматически приводится к числовому типу данных - нулю (0);
//
// Результатом  присваивания переменной x должен быть 0: постфиксный оператор инкрементирования
// возвращает значение операнда. Но это не так. Не так. Не так. Успокойся, Ватсёрнейм.


Whatsername 14.04.2006 13:42

Код:

var x;
var y;
//
x = y++;

Этот код (опустив особенность постфиксного инкрементирования) можно переписать так:
Код:

var x;
var y;
//
x = y = y + 1;
trace(x); // 1 Как и ожидалось

Это очевидно. Но иллюстрирует загадку выше.

iNils 14.04.2006 14:08

Все же просто
Код:

var x;
var y;
trace ("x=");
trace(x)
trace ("y=");
trace (y);
trace ("-------")
//
x = y++;
trace ("x=");
trace(x)
trace ("y=");
trace (y);

у до присвоения есть undefined, это значение мы и передаем x, а потом уж y увеличиваем на 1.
Но это для 6-го флеша, версии выше в результате дадут NaN для y.

Whatsername 14.04.2006 18:52

iNils, выпить бы с тобой водки!
Инструкция постфиксного инкрементирования сперва возвращает значения операнда, а потом его инкрементирует. Я всегда знал как это работает, но это не помешало мне запутаться. Спасибо. Спасибо. :yahoo:

Поведение седьмого и восьмого плееров мне не понятно. Но так как я (пока еще) не занимался AS2, это вполне последовательно. :)

UPD:
Подозреваю, что автоматическое приведение типов данных в седьмом Флэше работает иначе.

manas 14.04.2006 21:32

по-ходу я понял всё же в чем дело!!!!

вместо
Цитата:

_global.glob++;
я сделал
Цитата:

++_global.glob;
ЗАРАБОТАЛО!!!! Ура!!!
Спасибо iNils!

iNils 14.04.2006 23:13

ничего ты не понял:)
разницы между:
Код:

_global.glob = 5;
_global.glob++;
trace (_global.glob); //6

и
Код:

_global.glob = 5;
++_global.glob;
trace (_global.glob); //6

Нет!
А здесь есть:
Код:

_global.glob = 5;
i = _global.glob++;
trace (i);//5

Код:

_global.glob = 5;
i = ++_global.glob;
trace (i);//6


manas 15.04.2006 10:52

:)
дело в том, что
Цитата:

_global.glob = 5;
_global.glob++;
trace (_global.glob); //6
у меня вообще почему-то не срабатывал:confused: уж не знаю почему...
и "trace" постоянно выдавал исходное значение
вот...


Часовой пояс GMT +4, время: 03:02.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.