Получаване на предупреждение за JSLint относно етикети в Javascript

В моя javascript имам това

    loopDeLoop:
        while (foo !== bar) {
            switch (fubar) {
                case reallyFubar:
                    if (anotherFoo == anotherBar) {
                        break loopDeLoop;
                    }
                    break;
                default:
                    break;
            }
        }

Но JSLint казва... предупреждение за мъх: използване на етикет

Ето бележките от JSLint

Етикети
JavaScript позволява всеки израз да има етикет, а етикетите имат отделно пространство за имена. JSLint е по-строг.

JSLint очаква етикети само за изрази, които взаимодействат с break: switch, while, do и for. JSLint очаква, че етикетите ще бъдат различни от променливи и параметри.

Как да конструирам горното, за да се отърва от предупреждението?

Благодаря,
Грег


person w4ik    schedule 19.12.2008    source източник
comment
Shog9 и EndangeredMassa Оценявам рефакторинга, но просто не се изразих ясно във въпроса си... Не съм загрижен за конструкцията на цикъла... това е Как да използвам етикет в javascript? Струва ми се, че съм го конструирал правилно, но JSLint хвърля предупреждението за използване на етикет. Така че наистина въпросът ми е Как да използвам правилно етикет в Javascript? или може би за да бъда по-точен...Как да използвам етикет в Javascript, така че JSLint да не извежда предупреждение?...BTW...кодът се изпълнява и работи добре в приложението...   -  person w4ik    schedule 15.08.2011


Отговори (3)


Използвате етикета правилно.

JSLint хвърля предупреждение, защото етикетите в Javascript са ужасно лош стил и JSLint иска да знаете това.

За да повторя, ако изобщо използвате етикети, дори и правилно, JSLint ще даде това предупреждение.

Редактиране: Изглежда, че може да можете да деактивирате предупреждението за етикет с директива за конфигурация -use_of_label.

person Triptych    schedule 19.12.2008
comment
Дали документацията просто е грешна? Пише, че го позволява на определени места. - person Barmar; 06.04.2019

Можете да зададете флаг, който определя дали сте приключили с работата в цикъла или не.

var done = false;
while (foo !== bar && !done) {
    switch (fubar) {
        case reallyFubar:
            if (anotherFoo == anotherBar) {
                done = true;
            }
            break;

        default:
            break;
    }

    if(!done) {
        //If you have more logic inside the loop, put it here
    }
}
person EndangeredMassa    schedule 19.12.2008

Трудно е да се направи препоръка, като се види как връзката между двата цикъла и превключвателя е оставена непрозрачна във вашия пример... Но винаги можете просто да превърнете имплицитния външен цикъл в явен външен цикъл, като поставите вътрешния цикъл в затваряне :

while ( (function() // loop while function returns true
{
   while (foo !== bar) 
   {
      switch (fubar) 
      {
         case reallyFubar:
            if (anotherFoo == anotherBar)
            {
               return true; // back to outer loop
            }
            break;
         default:
            break;
       }
   }
   return false; // done looping
})()) {};

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

person Shog9    schedule 19.12.2008