---
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("Выражение начинается с унарного плюса");
}();
```

🚀 **Источник: [https://learn.javascript.ru/variables](https://learn.javascript.ru/variables)**