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;
 }

По той же причине предупреждение компилятора, когда вы объявляете некоторую переменную дважды в теле функции.