Actionscript: Почему можно назначить переменную до ее объявления?
вдохновленный вопросом int a [] = {1,2,}; Разрешена странная запятая. Любая конкретная причина? Я вспомнил вопрос о синтаксисе в Adobe ActionScript.
По какой-то причине возможно (по крайней мере, в Flex 3) присвоить значение переменной до ее объявления:
public function foo() : void {
a = 3;
var a : int = 0;
}
Это имеет смысл...? Это ошибка в компиляторе Adobe FlexBuilder? Или это из-за, возможно, некоторого наследия для более старых выпусков Ecmarkcript?
Ответы
Ответ 1
Интересным следствием отсутствия блочного уровня является то, что вы можете читать или записывать переменную до ее объявления, если она объявлена до завершения функции. Это связано с техникой под названием hoisting, что означает, что компилятор перемещает все объявления переменных в начало функции. Например, следующий код компилируется, даже если начальная функция trace() для переменной num происходит до объявления num-переменной...
ActionScript 3.0 Docs - Переменные (цитата найдена около 2/3 вниз по странице)
Ответ 2
Насколько я знаю, это функция Flash Virtual Machine, которая объявляет (выделяет память и т.д.) все переменные функции перед выполнением функции тела. Поэтому объявление переменной где-то в функциональном блоке в коде ActionScript просто сообщает компилятору объявить переменную и объявляет ее в начале функционального блока во время выполнения. Поэтому ваш код будет таким же, как:
public function foo() : void {
var a : int = 3;
a = 0;
}
По той же причине предупреждение компилятора, когда вы объявляете некоторую переменную дважды в теле функции.
Ответ 3
Дальнейшая ссылка: http://wiki.joa-ebert.com/index.php/Local_Variables