Modern JS Cheatsheet / Памятка по современному JavaScript: Объявление переменных
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
### Объявление переменных: var, const, let Tomatoknight 27.09.17 в 13:45 |
|
|
В JavaScript три ключевых слова, отвечающих за объявление переменных, и у каждого из них свои особенности. Эти слова - "var", "let" и "const". Tomatoknight 27.09.17 в 13:45 |
||
|
#### Краткое объяснение Tomatoknight 27.09.17 в 13:45 |
||
|
Переменные, объявленные при помощи ключевого слова "const", нельзя переопределить. "Let" и "var" - можно. Tomatoknight 27.09.17 в 13:48 Переменным, объявленным с помощью ключевого слова ```const```, нельзя позднее присвоить новое значение, в то время как переменным, объявленным с помощью ```let``` или ```var```, можно. a_popova 02.10.17 в 14:35 |
||
|
Я рекомендую всегда объявлять переменные ключевым словом "const", а "let" использовать только в том случае, если позже эту переменную понадобится *изменить* или переопределить. Tomatoknight 27.09.17 в 13:50 Я рекомендую всегда объявлять все переменные по умолчанию с помощью ```const```, а те, которые можно нужно будет *изменить* или передопределить, с помощью ```let```. a_popova 02.10.17 в 14:36 |
||
|
<table> Tomatoknight 27.09.17 в 13:56 |
||
|
#### Пример кода Tomatoknight 27.09.17 в 13:56 |
||
|
```javascript Tomatoknight 27.09.17 в 13:57 Вызовет ошибку, переменной "person" нельзя присвоить новое значение a_popova 02.10.17 в 14:37 |
||
|
```javascript Tomatoknight 27.09.17 в 13:58 присвоение нового значения разрешено в случае с let a_popova 02.10.17 в 14:38 |
||
|
#### Подробное объяснение Tomatoknight 27.09.17 в 13:58 |
||
|
[*Область видимости*](#scope_def) переменной определяет, где эта переменная доступна в коде. a_popova 02.10.17 в 14:39 |
||
|
##### var Tomatoknight 27.09.17 в 13:59 |
||
|
Переменные, объявленные словом "var", имеют *область видимости на уровне функций*. Это значит, что, когда в функции создается переменная, то всё, что внутри этой функции, имеет к этой переменной доступ. И если у переменной *область видимости на уровне функций*, то доступа извне этой функции к этой переменной нет. Tomatoknight 27.09.17 в 14:06 Областью видимости переменных, объявленных с помощью ```var```, является функция. Это означает, что если переменная была создана внутри функции, то у всего внутри этой функции есть доступ к этой переменной. Кроме того, переменная с областью видимости внутри функции недоступна за пределами этой функции. a_popova 02.10.17 в 14:43 |
||
|
Можно думать об этом вот так: если у переменной область видимости *Х*, то эта переменная - как бы свойство Х. Tomatoknight 27.09.17 в 14:08 Я рекомендую представлять это как будто переменная с областью видимости X означает, что эта переменная является свойством X. a_popova 02.10.17 в 14:44 |
||
|
```javascript Tomatoknight 27.09.17 в 14:09 |
||
|
Вот несколько менее очевидный пример области видимости переменных: Tomatoknight 27.09.17 в 14:10 |
||
|
```javascript Tomatoknight 27.09.17 в 14:13 // действительно, myVar имеет область видимости внутри функции, мы всего лишь удалили предыдущее значение переменной myVar "Nick" и заменили его на "John" a_popova 09.10.17 в 14:03 |
||
|
Кроме этого, переменные, объявленные ключевым словом *var*, при исполнении кода перемещаются в начало области видимости. Это называется [поднятие переменных](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/var#Поднятие_переменных). Tomatoknight 27.09.17 в 14:17 |
||
|
Этот фрагмент кода: a_popova 02.10.17 в 14:45 |
||
|
```js Tomatoknight 27.09.17 в 14:18 |
||
|
при исполнении понимается как: Tomatoknight 27.09.17 в 14:18 |
||
|
```js Tomatoknight 27.09.17 в 14:18 |
||
|
##### let Tomatoknight 27.09.17 в 14:19 |
||
|
```var``` и ```let``` очень похожи друг на друга, но переменные, объявленные словом ```let```: Tomatoknight 27.09.17 в 14:19 |
||
|
- имеют *блоковую область видимости* Tomatoknight 27.09.17 в 14:21 • имеют в качестве области видимости блок a_popova 02.10.17 в 14:45 - имеют в качестве области видимости блок wizjer 11.10.17 в 05:47 |
+2 | |
|
Давайте разберем, насколько важна блоковая область видимости, на том же самом примере: Tomatoknight 27.09.17 в 14:21 |
||
|
```javascript Tomatoknight 27.09.17 в 14:24 |
||
|
<a name="tdz_sample"></a> Теперь посмотрим, что значит "переменные, объявленные словами "let" и "const", недоступны до их объявления": Tomatoknight 27.09.17 в 14:26 <a name="tdz_sample"></a> Теперь рассмотрим, что означает тот факт, что переменные, объявленные с помощью *let* (и *const*) недоступны до того, как им присвоены значения: a_popova 02.10.17 в 14:46 |
||
|
```js Tomatoknight 27.09.17 в 14:27 |
||
|
В отличие от переменных *var*, если попытаться прочитать или записать переменную *let* или *const* до того, как они объявлены, выбрасывается ошибка. Этот феномен часто называется [*временной мертвой зоной*](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/let#Временные_мертвые_зоны_и_ошибки_при_использовании_let), или *ВМЗ*. Tomatoknight 27.09.17 в 14:30 В отличие от переменных, объявленных с помощью *var*, если вы попытаетесь прочитать или записать переменную, объявленную с помощью *let* или *const*, до того, как ей будет присвоено значение, произойдёт ошибка. Этот феномен часто называют [*Временной мёртвой зоной*](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_Dead_Zone_and_errors_with_let). a_popova 02.10.17 в 14:47 |
||
|
**Примечание:** строго говоря, переменные *let* и *const* тоже поднимаются, но их объявление - нет. Они сделаны так, что использовать их до объявления нельзя. Поэтому интуитивно ощущается так, будто эти переменные не поднимаются - но это не так. Если интересно, детали можно узнать в [этом очень подробном объяснении](http://jsrocks.org/2015/01/temporal-dead-zone-tdz-demystified). Tomatoknight 27.09.17 в 14:33 > **Примечание:**: Технически объявления переменных с использованием *let* и *const* тоже поднимаются, однако их присваивания - нет. Хотя это сделано для того, чтобы переменные нельзя было использовать до присвоения им значений, интуитивно кажется, что подъёма нет, но он есть. Ищите больше информации в [этом очень подробном объяснении](http://jsrocks.org/2015/01/temporal-dead-zone-tdz-demystified), если хотите знать больше. a_popova 02.10.17 в 14:47 **Примечание:** строго говоря, объявления переменных с использованием *let* и *const* тоже поднимаются, однако их инициализация — нет. Они сделаны так, что использовать их до объявления нельзя. Поэтому интуитивно ощущается так, будто эти переменные не поднимаются — но это не так. Ищите больше информации в [этом очень подробном объяснении](http://jsrocks.org/2015/01/temporal-dead-zone-tdz-demystified), если хотите знать больше. wizjer 11.10.17 в 05:56 |
+1 | |
|
Кроме того, переменную *let* нельзя объявлять несколько раз: Tomatoknight 27.09.17 в 14:33 В дополнение к сказанному, вы не можете переобъявить переменную, объявленную с помощью *let*: a_popova 09.10.17 в 14:38 |
||
|
```js Tomatoknight 27.09.17 в 14:34 |
||
|
##### const Tomatoknight 27.09.17 в 14:34 |
||
|
Переменные, объявленные ключевым словом "const", ведут себя так же, как переменные *let*, только их еще и нельзя переопределять. Tomatoknight 27.09.17 в 14:35 Переменные, объявленные с помощью ```const```, ведут себя так же, как переменные, объявленные с помощью *let*, но также им не может быть присвоено новое значение. a_popova 02.10.17 в 14:48 |
||
|
То есть, переменные *const*: Tomatoknight 27.09.17 в 14:35 Подводя итог, переменные объявленные с помощью *const*: a_popova 02.10.17 в 14:49 |
||
|
- имеют *блочную область видимости* Tomatoknight 27.09.17 в 14:36 - имеют в качестве области видимости блок a_popova 02.10.17 в 14:49 - имеют в качестве области видимости блок wizjer 11.10.17 в 05:58 |
||
|
```js Tomatoknight 27.09.17 в 14:36 |
||
|
```js Tomatoknight 27.09.17 в 14:37 |
||
|
<a name="const_mutable_sample"></a> Но есть нюанс: переменные "const" можно [**изменять**](#mutation_def) ! Если точнее, это значит, что **можно** изменять *объекты* и *массивы* в переменных *const*. Tomatoknight 27.09.17 в 14:39 <a name="const_mutable_sample"></a> Но есть одна тонкость: переменные, объявленные с помощью ```const```не являются [**неизменными**](#mutation_def) ! Конкретно это означает, что *объекты* и *массивы*, объявленные с помощью ```const```, **могут** быть изменены. . a_popova 02.10.17 в 14:49 |
||
|
В случае объектов: Tomatoknight 27.09.17 в 14:40 Для объектов: a_popova 09.10.17 в 15:11 |
||
|
В случае массивов: Tomatoknight 27.09.17 в 14:41 Для массивов: a_popova 09.10.17 в 15:08 |
||
|
#### Внешние ресурсы Tomatoknight 27.09.17 в 14:41 |
||
|
- [Область видимости let и const в JavaScript - WesBos](http://wesbos.com/javascript-scoping/) Tomatoknight 27.09.17 в 14:42 |
