JSLint, else и ожидаемое ровно одно пробел между ошибкой '}' и 'else'

Почему JSLint отчет в коде:

function cos(a) {
    var b = 0;
    if (a) {
        b = 1;
    }
    else {
        b = 2;
    }

    return b;
}

Ошибка:

Problem at line 6 character 5: Expected exactly one space between '}' and 'else'.

Эта ошибка может быть отключена, отключив опцию "Пустое пустое пространство" для JSLint.

Или, другими словами, почему синтаксис: } else { лучше, чем

...
}
else {
...

Google также использует синтаксис с формой } else {.

Но я не понимаю, почему. Google упомянул о "неявной вставке с запятой", но в контексте открытия {, не закрывая его.

Может ли Javascript вставить точку с запятой после закрытия } блока if, даже если следующий токен - это else инструкция?

Извините, что мой вопрос немного хаотичен - я пытался думать громко.

Ответ 1

JSLint основан на предпочтениях Крокфорда (которые я разделяю в этом случае).

Это вопрос мнения, который "лучше".

(Хотя ясно, что его мнение правильно;)

Ответ 2

Это не вопрос стиля. Это работает ECMAScript.

К лучшему или к худшему, он будет автоматически вставлять точки с запятой в конце инструкций, где это необходимо.

JavaScript интерпретирует это:

function someFunc {
    return
    {
        something: 'My Value'
    };
}

Как это:

function someFunc {
    return;
    {
        something: 'My Value'
    };
}

Это, безусловно, то, чего вы не хотите.

Если вы всегда кладете скобку в ту же строку, что и оператор if и if else, вы не столкнетесь с такой проблемой.

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

Mozilla Developer Network также поддерживает тот же брекетинг строки: https://developer.mozilla.org/en-US/docs/User:GavinSharp_JS_Style_Guidelines#Brackets

Ответ 3

JSLint здесь очень придирчив, просто применяя стиль, который вы не можете использовать.

Попробуйте JSHint:

Первоначально проект начинался с того, чтобы сделать более настраиваемую версию JSLint - та, которая не применяет один конкретный стиль кодирования для своих пользователей [...]

Ответ 4

JSLint здесь просто придирчива. Парень, который написал его, также испек во многих стилистических предложениях, чтобы сохранить его собственный код более последовательным.

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

Если вы хотите больше узнать о вставке точки с запятой, я рекомендую эту приятную ссылку

В принципе, если вы вставляете точки с запятой всюду, вам нужно только быть осторожным, чтобы поставить аргумент "return" или "throw" (или метка для "break" и "continue" ) в той же строке.

И когда вы случайно забыли точку с запятой, единственными распространенными случаями, которые могут вас укусить, является то, что вы начинаете следующую строку с литерала массива (он может анализироваться как оператор индекса) или партизированного выражения (он может быть проанализирован как вызов функции)

Заключение

Если вы опускаете дополнительные точки с запятой или нет? Ответ - вопрос личные предпочтения, но должны быть сделаны на основе а не туманные страхи неизвестных синтаксических ловушек или несуществующие ошибки браузера. Если вы помните правила, приведенные здесь, вы оснащены, чтобы сделать свой собственный выбор, и прочитать любой JavaScript легко.

Если вы решите опустить точки с запятой, где это возможно, я советую вставьте их непосредственно перед открывающей скобкой или квадратом скобки в любом заявлении, которое начинается с одного из этих жетонов, или любого который начинается с одного из арифметических операторных токенов "/", "+" или "-", если вам нужно написать такое выражение.

Если вы опускаете точки с запятой или нет, вы должны помнить (возврат, разрыв, продолжение, бросок и приращение приращения и операторы декремента), и вы должны не стесняться использовать линейные разрывы везде, чтобы улучшить читабельность вашего кода.


Кстати, я лично считаю, что версия } else { красивее. Прекратите настаивать на своих злых путях и присоединяется к нам на светлой стороне силы: P

Ответ 5

Я только что закончил читать книгу под названием "Освоение высокой производительности JavaScript". Здесь я говорю под поправкой, но из того, что я могу собрать, является то, что "пустое пространство" действительно имеет значение.

Это связано с тем, как интерпретатор получает следующую функцию. Удерживая пробел до минимума (т.е.), Используя minifier, когда ваш код готов к развертыванию, вы фактически ускоряете процесс.

Если интерпретатору необходимо выполнить поиск по пробелу, чтобы найти следующее утверждение, это требует времени. Возможно, вы хотите протестировать это с помощью кода, который запускает цикл: 10000 раз с пробелом, а затем тот же самый код, который был сокращен.

Заявление перед началом цикла будет console.time и, наконец, console.timeEnd в конце цикла. Затем вы узнаете, сколько миллисекунд, которое цикл принял для вычисления.

Ответ 6

Ошибка/предупреждение JSLint предлагает изменить код на

// naming convention winner? it subjective
} else if{
    b = 2;
}

от

}
else if{
 b = 2;
}

Это предотвращает вставить точки с запятой; считается более стандартным и условным. большинство людей могли бы согласовать вкладку между }tabelse if{

не самый популярный метод. Интересно, как размещается открывающий кронштейн { (пробел или нет), очевидно, оба они подвергнуты