# Подводные камни IIFE в JavaScript

Давайте рассмотрим два кусочка кода.

Первый:

`let result = 1 +function() { return 2; }(); console.log(result);`

Второй:

`let result = 1; +function() { return 2; }(); console.log(result);`

Эти два кусочка кода практически одинаковы, но если их запустить - результат будет отличаться. Первый код выведет в консоль число `3`, а второй - число `1`.

Почему получилась такая разница: все дело в том, что в одном случае в первой строке кода в конце отсутствует точка с запятой, а во втором случае - присутствует.

Вы можете спросить: как же так, ведь в JavaScript точка с запятой в конце команды не является обязательной! На самом деле это не совсем так. Давайте разберемся, что у нас на самом деле происходит.

Первый код можно переписать вот так:

`let result = 1 + function() { return 2; }(); console.log(result); // выведет 3`

Теперь сразу становится очевидным, что к единице прибавляется результат вызова функции на месте, то есть `2`. Поэтому итоговый результат будет `3`.

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

`// Первая команда: let result = 1; // Вторая команда: +function() { return 2; }(); // Третья команда: console.log(result); // выведет 1`

То есть присваивание в переменную и вызов функции на месте станут разными командами. И все из-за наличия точки с запятой!

Получается, что в данном случае вызов функции на месте вообще ничего не делает - просто вникуда возвращает число `2`, которое никак не влияет на переменную `result`.

Давайте тогда разберемся, а почему мы вообще можем не писать точку с запятой в JavaScript. Пусть у нас есть такой код без точек с запятыми:

`let result = 1 // в result запишется 1 let test = 2 // в test запишется 2`

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

Но посмотрите на такой код:

`let result = 1 + 2; // в result запишется 3`

Теперь точка с запятой в конце первой строки не поставится автоматически, так как интерпретатор понимает, что команда второй строки - это часть команды первой строки.

Но если мы сами поставим точку с запятой - результат будет совсем другим:

`let result = 1; // в result запишется 1 + 2; // команда ничего не делает, но и ошибки не будет`

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

А теперь посмотрите на этот код:

`let result = 1 +function() { return 2; }(); console.log(result);`

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

← →
↑
en ru