Получение предупреждения 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 не выдавал предупреждение?... Кстати... код работает и отлично работает в приложении...   -  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