// home / Статьи / Подводные камни JavaScript или опасное свойство Semicolon insertion.

Подводные камни JavaScript или опасное свойство Semicolon insertion.

Автор: Evgeny Sergeev

Я очень люблю язык 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 вызовет проблемы при выполнении кода. Поэтому я приглашаю всех дополнить эту статью своими примерами и мыслями используя для этого комментарии.

  1. Самый простой способ - таки писать ; самому везде где оно нужно.
    Любые попытки положиться на умолчания такого рода приведут к ошибкам рано или поздно.

  2. @Kpoxa

    Ну так статья как раз о том, что недостаточно «писать ; самому везде где оно нужно».

    Из-за того, что интерпретатор сам расставляет «;», там где они не предполагались (см. примеры с return).

  3. Полный абзац, даже не знал об этом и заглянул в ECMAScript Language Specification. Там этому целая секция посвящена (7.9.1)

    Вообщем jslint поможет, но еще проще s/\\?$//g

Leave a Reply