Лучше ли определять переменные вне циклов? - PullRequest
5 голосов
/ 24 ноября 2011

Второй лучше первого?

ПЕРВОЕ:

var count:int=myArray.length;
for(var i:uint=0;i<count;i++)
{
   var str:String=myArray[i].label;
   var somethingElse:Class=...;
   var andAnotherThing:MyInstance=new MyInstance(somethingElse);
   ...
}

ВТОРОЙ:

var count:int=myArray.length;
var str:String;
var somethingElse:Class;
var andAnotherThing:MyInstance;
for(var i:uint=0;i<count;i++)
{
   str=myArray[i].label;
   somethingElse=...;
   andAnotherThing=new MyInstance(somethingElse);
   ...
}

Спасибо.

Ответы [ 4 ]

8 голосов
/ 24 ноября 2011

В Actionscript и Javascript переменные ограничиваются функцией, а не блоком. Это называется переменным подъемом.

Переменные ActionScript 3.0

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

Таким образом, ваш код будет вести себя так, независимо от того, где вы объявили свои переменные в функции:

var count:int;
var str:String;
var i:uint;
var somethingElse:Class;
var andAnotherThing:MyInstance;

count = myArray.length;
for(i=0;i<count;i++)
{
   str=myArray[i].label;
   somethingElse = ...;
   andAnotherThing = new MyInstance(somethingElse);
   ...
}

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

2 голосов
/ 24 ноября 2011

ActionScript не дает блокам выполнения (например, блоку for) собственную область видимости, в отличие от некоторых других языков.Наименьшая область действия для переменной - это функция.Так что для компилятора оба эти примера одинаковы.Фактически, реализация - это метод, называемый «подъем переменной», при котором компилятор перемещает объявление переменной до начала области действия.

Это имеет некоторые интересные, если не неожиданные, побочные эффекты;Вы можете эффективно «использовать» переменную до того, как она была «объявлена».Например:

trace(test);  // NaN
var test:Number = 10;
trace(test);  // 10

Обратите внимание, что первая трассировка не дает сбоя.

В любом случае, главное, что нужно помнить, это то, что переменные локально ограничены функциями.Это особенно важно при работе с замыканиями.

2 голосов
/ 24 ноября 2011

На Flash ответ не имеет значения.Flash странный, когда дело доходит до объявления переменных.Выполните следующие действия и посмотрите, что произойдет:

for(var i:uint=0;i<count;i++)
{
   var str:String=myArray[i].label;
   var somethingElse:Class=...;
   var andAnotherThing:MyInstance=new MyInstance(somethingElse);
}
var str:String=myArray[i].label;

Даже если str вышел из области действия цикла for, вы получите предупреждение о переопределении переменной, означающее, что переменная будет «инициализирована» только один раза для цикла;

1 голос
/ 24 ноября 2011

В ActionScript 3 я не думаю, что это действительно имеет значение.Я полагаю, что в других языках циклы имеют собственную область видимости, что означает, что определенные в них переменные не доступны вне цикла.

Я думаю, что единственное отличие в AS3 состоит в том, как это влияет на читабельность.На мой взгляд, первый пример гораздо приятнее.

Раньше я часто определял итератор над циклом для удобства чтения, например:

var i:MovieClip;
for each(i in movieClipArray)
{
    trace(i);
}

Но с тех пор, как попал на различные языкиЯ сохранил все содержимое для согласованности:

for each(var i:MovieClip in movieClipArray)
{
    trace(i);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...