Получение предупреждения JSLint относительно меток в Javascript - PullRequest
4 голосов
/ 19 декабря 2008

В моем JavaScript есть это

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

Но JSLint говорит ... предупреждение lint: использование метки

Вот заметки от JSLint

Метки
JavaScript позволяет любому выражению иметь метку, а метки имеют отдельное пространство имен. JSLint более строгий.

JSLint ожидает метки только для операторов, которые взаимодействуют с break: switch, while, do и for. JSLint ожидает, что метки будут отличаться от переменных и параметров.

Как мне сконструировать вышесказанное, чтобы избавиться от предупреждения?

Спасибо
Грег

Ответы [ 3 ]

14 голосов
/ 20 декабря 2008

Вы используете этикетку правильно.

JSLint выдает предупреждение, потому что надписи в Javascript ужасно плохи, и JSLint хочет, чтобы вы это знали.

Повторюсь, если вы используете метки вообще, даже правильно, JSLint выдаст это предупреждение.

Edit: Похоже, вы можете отключить предупреждение метки с помощью директивы конфигурации -use_of_label.

0 голосов
/ 19 декабря 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
})()) {};

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

0 голосов
/ 19 декабря 2008

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

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