Ошибка Flash 1151 в цикле for - PullRequest
0 голосов
/ 25 июля 2010

У меня странная проблема, связанная с ошибкой Flash 1151: существует конфликт с определением i во внутреннем пространстве имен.

Вот проблемный код:

for(var i:Number=dt.getFullYear(); i >= dt.getFullYear()-90; i--)
{
    dtYear.addItem( {label:i, data:i} );
} //for

//-*-*-* Month
for(var i:Number=0; i < months.length; i++)
{
    dtMonth.addItem( {label:i, data:i} );
} //for

Или более вопиющий пример:

for(var i:Number=0; i < 12; i++)
{
    trace(i);
} //for

//-*-*-* Month
for(var i:Number=0; i < 12; i++)
{
} //for

Adobe дает объяснение:

You cannot declare more than one variable with the same identifier name within the same scope unless all such variables are declared to be of the same type. In ActionScript 3.0, different code blocks (such as those used in two for loops in the same function definition) are considered to be in the same scope.

Что за чертовщина? Я имею в виду, что переменная i все время существует как число, типизировано как число, почему, черт возьми, вышеприведенный код может не работать?

Если я изменю его таким образом, он сработает, НО ЭТО УРОГО И ПОЧЕМУ ЭТО НУЖНО? AAARGGGHHHH ... Разработка Flash сводит меня с ума. Дай мне пистолет :). Кто-нибудь, объясните мне это, пожалуйста.

Рабочий код:

for(var i:Number=dt.getFullYear(); i >= dt.getFullYear()-90; i--)
{
    dtYear.addItem( {label:i, data:i} );
} //for

//-*-*-* Month
for(i=0; i < months.length; i++)
{
    dtMonth.addItem( {label:i, data:i} );
} //for

Ответы [ 2 ]

3 голосов
/ 25 июля 2010

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

Здесь документация об использовании переменной и объявление для более подробной информации.

2 голосов
/ 25 июля 2010

Краткий ответ: вы не можете дважды объявить «var i» в одной и той же функции.Во втором цикле замените «i» на «j», и вы получите золото.

...