JSLint, else и Ожидается ровно один пробел между ошибками '}' и 'else' - PullRequest
11 голосов
/ 15 ноября 2011

Почему 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 инструкция?

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

Ответы [ 6 ]

10 голосов
/ 15 ноября 2011

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

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

(хотя, очевидно, его мнение верно;)

5 голосов
/ 02 апреля 2014

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

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

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

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

Как это

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

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

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

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

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

3 голосов
/ 15 ноября 2011

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

Попробуйте JSHint вместо:

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

3 голосов
/ 15 ноября 2011

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

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

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

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

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

Заключение

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

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

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


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

0 голосов
/ 23 июня 2017

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

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

от

}
else if{
 b = 2;
}

Он запрещает вставлять точки с запятой; считается более стандартным и обычным. большинство людей могут договориться о вкладке между }<kbd>tab</kbd>else if{

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

0 голосов
/ 23 ноября 2015

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

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

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

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

...