Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с ссылками на объект. (http://www.flasher.ru/forum/showthread.php?t=184513)

red_penguin 20.09.2012 15:50

Проблема с ссылками на объект.
 
Код AS3:

for (var i:int = 0; i < 10; i++)
{
        var view:MovieClip;
        if (i == 0)
        {
                view = new MovieClip;
                view.x = 5;
                trace("YAP");
        }
        trace(view, view.x);
}

В консоль выводится:
Код:

YAP
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5
[object MovieClip] 5

Как можно увидеть по не хитрому коду и распечатке дела творятся странные)
Разве не должна команда trace при i не равном 0 выводить null?

КорДум 20.09.2012 15:52

Нет. view-то так и ссылается на первый экземпляр (он же единственный).

red_penguin 20.09.2012 15:58

но я же каждую итерацию создаю новую переменную.
Разве не именно эту переменную печатает trace?
И разве она не пустая раз я её не инициализирую?

КорДум 20.09.2012 15:59

Эта строчка, грубо говоря, игнорируется компилятором. Если поставить брейкпоинт на ней, то он даже не сработает.

red_penguin 20.09.2012 16:00

а не могли объяснить почему так?

КорДум 20.09.2012 16:02

Все переменные, объявленные внутри циклов, всегда переносятся в байткоде (кажется там) в начало метода.
например отсюда
Код AS3:

for (var i:int = 0; i < 10; i++)

i тоже вынесется в начало метода при компиляции.

Я имею в виду объявление переменных, естественно.

red_penguin 20.09.2012 16:04

ах вот оно как...
Это многое объясняет)

А ведь такая работа кода - это ошибка компилятора выходит?

КорДум 20.09.2012 16:06

Не ошибка, а особенность. К ней надо привыкнуть и учесть, что
Код AS3:

for (var i:uint = 0; i < 10; i++) {}
var i:uint = 10;

даст варнинг о дубликате объявления переменной

Добавлено через 1 минуту
То есть область видимости метода - это область видимости всего, что находится внутри метода (кроме переменных в анонимных функциях внутри этого метода).

red_penguin 20.09.2012 16:09

теперь все ясно. спасибо)
Я то думал что то что тело цикла - это как тело функции.

А про ваш случай думал, что конструкция var i:uint в описании цикла относиться как раз к телу)

Век живи, век учись)

КорДум 20.09.2012 16:10

Тогда вот пример более ярко показывающий скоуп:
Код AS3:

for (var i:uint = 0; i < 10; i++) {
    var myVar:Object = {};
}
 
var myVar:Object = null; // варнинг



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

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