Обработка переменных AS3 AVM / компилятором / областью - PullRequest
0 голосов
/ 12 апреля 2010

У меня есть пара вопросов об обработке переменных AS3 с помощью AVM / compiler / scope

0,1. Этот код во Flash выдаст ошибку:

<code>function myFunction() {
    var mc:MovieClip=new MovieClip();
    var mc:MovieClip=new MovieClip();
}

но это не вызовет ошибку во Flex (только предупреждение в редакторе). Почему?


0,2. Как Flash видит переменные в циклах? Видимо это:

<code>for (var i:int=0; i<2; i++) {
    var mc:MovieClip=new MovieClip();
}
не равно просто:
var mc:MovieClip=new MovieClip();
var mc:MovieClip=new MovieClip();
, потому что это вызовет ошибку снова, как раньше в Flash, но во Flex в функции нет? Flash как-то меняет мой цикл перед компиляцией?

0,3. Где в классе, эквивалентном временной шкале во Flash - где в классе я бы поместил код, который я обычно помещаю на временной шкале (я предполагаю, что это не конструктор из-за того, что я написал ранее, или, возможно, дело в компиляторе Flash / Flex )


@ fenomas спасибо за объяснение, но я проверил 1. ответ, и это не совсем верно :) этот код:

function myFunction() {
    var mc:MovieClip=new MovieClip();
    mc.graphics.beginFill(0x0000FF);
    mc.graphics.drawRect(0,0,100,100);
    mc.graphics.endFill();
    addChild(mc);
    var mc:MovieClip=new MovieClip();
    mc.graphics.beginFill(0x000000);
    mc.graphics.drawRect(0,0,30,30);
    mc.graphics.endFill();
    addChild(mc);
}
myFunction();
будет компилироваться во Flash в строгом режиме, но с отключенным режимом предупреждения и не будет выдавать ошибку во время компиляции или выполнения.

И он также будет хорошо компилироваться и выполняться во Flex (событие с командами компилятора -strict -warnings) (проверено с помощью Flash CS3 и FlashBuilder 4).

Тот же код, но не включенный в функцию, будет генерировать ошибку времени компиляции независимо от того, включены ли какие-либо режимы ошибок (строго / предупреждение) во Flash.

Это то, что @ back2dos сказал о Flash Compiler, который ведет себя странно?

В чем различия между этими двумя компиляторами Flash / Flex (почему я должен менять режим ошибок во Flash, а Flex ни о чем не заботится :))?

Ответы [ 2 ]

1 голос
/ 12 апреля 2010

Хорошо, я объясню вам, как область действия ActionScript (классы и глобальные функции) на уровне пакета.

Оператор var объявляет переменную в области видимости тела функции, в которой она находится. Ее видимость находится внутри всего тела. таким образом, следующее полностью верно.

a = 3;
if (Math.random()>0.5) {
    var a:int = 0;
}
else {
    a = 6;
}

это ужасно, но оно основано на устаревшем проекте ECMA-Script AS3, основанном на ... ууу! (

для простоты представьте, что все объявления переменных фактически находятся в начале тела содержащей функции (в то время как их инициализация фактически выполняется в том месте, где вы ее поместили)

* Таким образом, 1011 *

for (var i:int=0; i<2; i++) {
    var mc:MovieClip=new MovieClip();
}

равно

var i:int, mc:MovieClip;
for (i=0; i<2; i++) {
    mc=new MovieClip();
}

первый фрагмент кода от вашего первого вопроса до определения дубликатов переменных, которое вызывает предупреждение компилятора, но работает так, как будто вы сделали только одно объявление.

что касается вашего третьего вопроса: эквивалента нет вообще.

AS3 во флэш-IDE и многие дружественные дизайнеру концепции (например, кадры) весьма неоднозначны. С точки зрения разработчика, Flash IDE - это худшая часть денег, которую вы можете получить за деньги (что мешает ей быть отличным инструментом для дизайна, рисования и анимации). если вы хотите ясного и последовательного поведения, я советую вам не использовать IDE-флеш-память для компиляции ActionScript или тратить время на попытки выяснить, почему он ведет себя так странно. Помимо его причуд, компиляция и странные вещи, которые он делает с вашим ActionScript, занимает много времени (например, преобразование объявления локальной переменной в объявление поля экземпляра (что, вероятно, является источником вашей проблемы)).

0 голосов
/ 12 апреля 2010

Это замечательные вопросы. В заказе:

  1. По умолчанию FLA авторизации Flash запускаются в строгом режиме. Вы можете изменить его в меню «Файл»> «Параметры публикации»> «Настройки AS3». Однако дублированные определения переменных не являются ошибкой времени выполнения, это просто то, о чем среда разработки может или не может выдавать предупреждение или ошибку, в зависимости от конфигурации и от того, является ли это сценарий класса или фрейма.

    Кстати, при сравнении Flash и Flex убедитесь, что ваши Flash-скрипты находятся внутри класса, так как фрейм-скрипты - это немного другое животное (как описано ниже).

  2. AS3 не имеет области действия уровня блока, поэтому он реализует практику, называемую «подъём», когда компилятор перемещает все объявления (но не присваивания) в начало функции, в которой они происходят. Следовательно, даже если ваш оператор var находится внутри цикла, объявление происходит только один раз, когда функция начинает выполняться. Подробнее см. здесь .

  3. Фрейм-скрипты немного аномальны. Они в некотором роде похожи на анонимные функции, за исключением того, что все сценарии на заданной временной шкале рассматриваются в одной и той же лексической области. Таким образом, если вы используете оператор var для создания локальной переменной в одном скрипте кадра, эта переменная все еще будет существовать, когда вы выполните другой скрипт кадра того же объекта.

    Это в основном по историческим причинам, но результат по сути такой же, как если бы все ваши сценарии фреймов выполнялись в одной большой функции и прыгал с GOTO. Следовательно, вы должны всегда хранить весь свой реальный код в классах и использовать фрейм-сценарии только для вызова методов классов, которые необходимо синхронизировать с анимацией временной шкалы. Это не только позволяет избежать точного понимания того, как фрейм-скрипты отличаются от кода класса, это хорошая практика кодирования по нескольким причинам, не связанным с тем, о чем мы здесь говорим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...