Я очень люблю язык JavaScript, на мой взгляд его преимущества с лихвой покрывают многочисленные недостатки. Но чтобы писать хорошие программы на этом языке нужно четко понимать какие опасности в нем таятся.
Одна из них заключается в том, что синтаксис JS не требует обязательного использования точки с запятой для разделения конструкций языка, но при этом на этапе выполнения недостающие символы расставляются автоматически.
Данная особенность, упрощает программирование и в простейших случаях не вызывает никаких проблем. Возьмем следующий код:
var a var b
Во время выполнения он будет преобразован к следующем виду:
var a; var b;
И это не приведет к негативным последствиям. Но к сожалению ни один язык в мире не способен читать мысли программиста, поэтому в другой ситуации неудачное преобразование может вызвать появление серьезных ошибок.
Для примера возьмем следующий код:
function a() { return false; }
Не трудно догадаться, что в данной ситуации программист хотел чтобы функция возвращала значение «false». Но на самом деле она возвращает значение «undefined». И это вполне закономерно, потому что реально исполняется совсем другой код:
function a() { return ; // Обратите внимание JS сам доставил «недостающий» знак точки с запятой false; }
Самое простое, что можно сделать для избежания проблем с Semicolon insertion — это не разрывать строки на две подстроки. Но и этого будет недостаточно, для написания абсолютно безопасного кода.
Синтаксис JavaScript очень похож на синтаксис языка «Си». Например, для выделения блоков когда в JS как и в «Си» используются фигурные скобки.
Обычно программисты предпочитают один из двух вариантов оформления.
Первый — это когда открывающая фигурная скобка находится на одном уровне с конструкцией к которой она относится:
function a() { return { value: false } }
Второй - когда открывающую скобку помещают на уровень ниже
function a() { return { value: false } }
Не трудно догадаться, что для JavaScript второй вариант пригоден не во всех случаях, в примере выше во время выполнения будет получен следующий код:
function a() { return ; value: false; }
Обратите внимание, что в этом примере не только прибавились «недостающие» знаки, но и исчезли «лишние» символы фигурных скобок. Поэтому, чтобы избежать проблем в JavaScript, лучше не использовать переносы строк перед открывающей фигурной скобкой.
Конечно, сказанное выше описывает далеко не все возможные ситуации когда Semicolon insertion вызовет проблемы при выполнении кода. Поэтому я приглашаю всех дополнить эту статью своими примерами и мыслями используя для этого комментарии.

Kpoxa
Гость
Самый простой способ - таки писать ; самому везде где оно нужно.
Любые попытки положиться на умолчания такого рода приведут к ошибкам рано или поздно.
Алик Кириллович
Гость
@Kpoxa
Ну так статья как раз о том, что недостаточно «писать ; самому везде где оно нужно».
Из-за того, что интерпретатор сам расставляет «;», там где они не предполагались (см. примеры с return).
Михаил
Гость
Полный абзац, даже не знал об этом и заглянул в ECMAScript Language Specification. Там этому целая секция посвящена (7.9.1)
Вообщем jslint поможет, но еще проще s/\\?$//g