--- sidebar_position: 2 --- # Переменные **Переменная** – это «именованное хранилище» для данных. Можно объявить при помощи: - **let** - **const** (константа, т.е. изменению не подлежит) - **var** (устаревший способ, подробности позже) ```js let message; message = 'Hello'; // сохранить строку 'Hello' в переменной с именем message let user = 'John', age = 25, message = 'Hello'; let user = 'John', age = 25, message = 'Hello'; ``` Имя переменной может включать: - Буквы и цифры, однако цифра не может быть первым символом. - Символы $ и _ используются наряду с буквами. - Иероглифы и символы нелатинского алфавита также допустимы, но обычно не используются. Переменные типизируются динамически. В них могут храниться любые значения. Всего существует 8 типов данных: - **number** для целых и вещественных чисел, - **bigint** для работы с целыми числами произвольной длины, - **string** для строк, - **boolean** для логических значений истинности или ложности: true/false, - **null** – тип с единственным значением null, т.е. «пустое значение» или «значение не существует», - **undefined** – тип с единственным значением undefined, т.е. «значение не задано», - **object** и **symbol** – сложные структуры данных и уникальные идентификаторы; их мы ещё не изучили. Оператор `typeof` возвращает тип значения переменной, с двумя исключениями: ```js typeof null == "object" // ошибка в языке typeof function(){} == "function" // именно для функций ``` ## Устаревшее ключевое слово "var" Обычно var не используется в современных скриптах, но всё ещё может скрываться в старых.\ Существует 2 основных отличия var от let/const: - Переменные var не имеют блочной области видимости, они ограничены, как минимум, телом функции. - Объявления (инициализация) переменных var производится в начале исполнения функции (или скрипта для глобальных переменных). ### Для «var» не существует блочной области видимости Область видимости переменных `var` ограничивается либо функцией, либо, если переменная глобальная, то скриптом. Такие переменные доступны за пределами блока. `var` выходит за пределы блоков `if`, `for` и подобных. Это происходит потому, что на заре развития JavaScript блоки кода не имели лексического окружения. ### «var» допускает повторное объявление Используя var, можно переобъявлять переменную сколько угодно раз. Повторные var игнорируются. ### «var» обрабатываются в начале запуска функции Это поведение называется «hoisting» (всплытие, поднятие), потому что все объявления переменных var «всплывают» в самый верх функции. Объявления переменных var обрабатываются в начале выполнения функции (или запуска скрипта, если переменная является глобальной). Другими словами, переменные var считаются объявленными с самого начала исполнения функции вне зависимости от того, в каком месте функции реально находятся их объявления (при условии, что они не находятся во вложенной функции). ***Объявления переменных «всплывают», но присваивания значений – нет.*** ### IIFE В прошлом, поскольку существовал только `var`, а он не имел блочной области видимости, программисты придумали способ её эмулировать. Этот способ получил название «Immediately-invoked function expressions» (сокращенно IIFE). Здесь создаётся и немедленно вызывается Function Expression. Так что код выполняется сразу же и у него есть свои локальные переменные. ```js // Способы создания IIFE (function() { var message = "Привет"; alert(message); // Привет })(); // Круглые скобки вокруг функции (function() { alert("Круглые скобки вокруг всего выражения"); }()); !function() { alert("Выражение начинается с логического оператора НЕ"); }(); +function() { alert("Выражение начинается с унарного плюса"); }(); ```