# Переменные. const, let, var

[![Generic badge](https://img.shields.io/badge/JavaScript-%D0%B4%D0%BB%D1%8F%20%D1%82%D1%83%D0%BF%D1%8B%D1%85-green.svg)](https://img.shields.io/badge/JavaScript-%D0%B4%D0%BB%D1%8F%20%D1%82%D1%83%D0%BF%D1%8B%D1%85-green.svg)

Итак, приступим к разбору `операторов`, которые дают жизнь `переменным`.

Как я и говорил в предыдущем уроке, у нас имеются целых 3 оператора для данного действа. Разберем каждый по порядку.

### var <a href="#toc_1" id="toc_1"></a>

```javascript
var a = 1;
```

Еще мой дед определял переменные с помощью данного оператора, а узнал он это от своего деда и так далее. Короче, все это в прошлом. Это чаще всего можно найти только в проектах с `legacy-кодом`, т.е., в проектах, которые были давно написаны и их ни разу не `рефакторили` (*`не обновляли код под новые стандарты`*). Но, рассказать об этом все равно стоило, так как это основа.

Оператор `var` определяет переменную в текущей области видимости.

`Область видимости переменной` - это функция, внутри которой она объявлена. Но, если переменную объявили не внутри функции, то ее область видимости - `глобальный объект window`, а это, на секундочку, весь документ.

Переменные объявленные данным оператором, также умеют всплывать, т.е. переменную можно вызвать еще до её определения и это не вызовет никаких ошибок. **Пример**:

```javascript
console.log(a); //выведет: undefined
var a = 1;
```

Результатом выполнения такого кода будет вывод в консоль `undefined,` а так происходит только в том случае, когда переменная уже определена, но у нее нет никакого значения.

### let <a href="#toc_2" id="toc_2"></a>

Этот оператор очень похож на оператор `var.` Главное их различие - **область видимости** (но об этом мы говорим позже).

Если попробовать повторить тот же самый код:

```javascript
console.log(a); //выведет: ReferenceError: a is not defined
let a = 1;
```

Как видишь, на этом моменте возникнет ошибка, в которой **JavaScript** говорит тебе, что ты косорукий и пытаешься использовать топор, когда его еще и не придумали.

Оператор `let` работает более предсказуемо, с ним проще, он твой дружище. **Не используй var - используй let**.

### const <a href="#toc_3" id="toc_3"></a>

```javascript
const a = 1;
```

Оператор очень обидчивый, и по всякой чепухе его лучше не дергать. Переменная объявленная с помощью данного оператора - это коробка, в которую **ОБЯЗАТЕЛЬНО** нужно что-то положить, а если уж положил, то **не трогать**!

На содержимое такой переменной можно только смотреть, любоваться. И даже не вздумай менять содержимое такой переменной. У тебя не получится. От слова «совсем».

У тебя лишь получится словить ошибку вида: `"Uncaught TypeError: Assignment to constant variable"`.

**Коротко и без аналогий**: переменная объявленная таким оператором обязательно должна иметь значение и его нельзя менять.

Если ты понял, что ты ничего не понял, то не переживай. Это не ты тупой, и даже не я. Со всеми этими областями видимости, которые ты сейчас вообще не понимаешь мы столкнемся еще ни раз в следующих уроках.

Я сторонник того, чтобы понимание приходило во время практики. Поэтому максимально усвой то, что написано выше, а все что не понятно — поймешь со временем.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thedvlpr.gitbook.io/javascript-for-dummies/peremennye.-const-let-var.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
