You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/10-es-modern/1-es-modern-usage/article.md
+1-13Lines changed: 1 addition & 13 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,5 @@
1
1
# ES-2015 сейчас
2
2
3
-
[smart header="Этот раздел -- в активной разработке"]
4
-
Стандарт ES-2015 недавно был принят окончательно, и этот раздел находится в ежедневной разработке.
5
-
6
-
[/smart]
7
-
8
3
[Стандарт ES-2015](http://www.ecma-international.org/publications/standards/Ecma-262.htm) был принят в июне 2015. Пока что большинство браузеров реализуют его частично, текущее состояние реализации различных возможностей можно посмотреть здесь: [](https://kangax.github.io/compat-table/es6/).
9
4
10
5
Когда стандарт будет более-менее поддерживаться во всех браузерах, то весь учебник будет обновлён в соответствии с ним. Пока же, как центральное место для "сбора" современных фич JavaScript, создан этот раздел.
@@ -68,7 +63,7 @@
68
63
69
64
Это означает, что при запуске примеров в браузере, который их не поддерживает, будет ошибка. Это не означает, что пример неправильный! Просто пока нет поддержки...
70
65
71
-
Рекомендуется [Chrome Canary](https://www.google.com/chrome/browser/canary.html), Edge или [Firefox Developer Edition](https://www.mozilla.org/en-US/firefox/channel/#developer).
66
+
Рекомендуется [Chrome Canary](https://www.google.com/chrome/browser/canary.html), Edge или [Firefox Developer Edition](https://www.mozilla.org/en-US/firefox/channel/#developer), большинство примеров в них работает.
72
67
73
68
Впрочем, если пример в браузере не работает (обычно проявляется как ошибка синтаксиса) -- почти все примеры вы можете запустить его при помощи Babel, на странице [Babel: try it out](https://babeljs.io/repl/). Там же увидите и преобразованный код.
Copy file name to clipboardExpand all lines: 1-js/10-es-modern/2-let-const/article.md
+31-12Lines changed: 31 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,12 +9,12 @@ let a = 5;
9
9
10
10
## let
11
11
12
-
У объявлений `let` три основных отличия от `var`:
12
+
У объявлений переменной через `let` есть три основных отличия от `var`:
13
13
14
14
<ol>
15
15
<li>**Область видимости переменной `let` -- блок `{...}`.**
16
16
17
-
Как мы помним, переменная, объявленная через `var`, видна везде в функции. В старом стандарте минимальная "область видимости" -- функция.
17
+
Как мы помним, переменная, объявленная через `var`, видна везде в функции.
18
18
19
19
Переменная, объявленная через `let`, видна только в рамках блока `{...}`, в котором объявлена.
20
20
@@ -37,7 +37,9 @@ if (true) {
37
37
alert(apples); // 10 (снаружи блока то же самое)
38
38
```
39
39
40
-
То же самое с `let`:
40
+
В примере выше `apples` -- одна переменная на весь код, которая модифицируется в `if`.
41
+
42
+
То же самое с `let` будет работать по-другому:
41
43
42
44
```js
43
45
//+ run
@@ -58,7 +60,25 @@ alert(apples); // 5 (снаружи блока значение не измен
58
60
59
61
Здесь, фактически, две независимые переменные `apples`, одна -- глобальная, вторая -- в блоке `if`.
60
62
61
-
Заметим, что если объявление `apples` в строке `(*)` закомментировать, то в последнем `alert` будет ошибка: переменная неопределена. Это потому что переменная `let` всегда видна именно в том блоке, где объявлена и не более.
63
+
Заметим, что если объявление `let apples` в первой строке `(*)` удалить, то в последнем `alert` будет ошибка: переменная неопределена:
64
+
65
+
```js
66
+
//+ run
67
+
'use strict';
68
+
69
+
if (true) {
70
+
let apples =10;
71
+
72
+
alert(apples); // 10 (внутри блока)
73
+
}
74
+
75
+
*!*
76
+
alert(apples); // ошибка!
77
+
*/!*
78
+
```
79
+
80
+
81
+
Это потому что переменная `let` всегда видна именно в том блоке, где объявлена, и не более.
62
82
63
83
</li>
64
84
<li>**Переменная `let` видна только после объявления.**
@@ -98,17 +118,16 @@ let x;
98
118
let x; // ошибка: переменная x уже объявлена
99
119
```
100
120
101
-
Это -- хоть и выглядит ограничением по сравнению с `var`, но на самом деле проблем не создаёт, так как область видимости ограничена блоком.
102
-
103
-
Например, два таких цикла совсем не конфликтуют:
121
+
Это -- хоть и выглядит ограничением по сравнению с `var`, но на самом деле проблем не создаёт. Например, два таких цикла совсем не конфликтуют:
104
122
```js
105
123
//+ run
106
124
'use strict';
107
125
126
+
// каждый цикл имеет свою переменную i
108
127
for(let i =0; i<10; i++) { /* … */ }
109
128
for(let i =0; i<10; i++) { /* … */ }
110
129
111
-
alert( i ); // ошибка, переменная не определена
130
+
alert( i ); // ошибка: глобальной i нет
112
131
```
113
132
114
133
При объявлении внутри цикла переменная `i` будет видна только в блоке цикла. Она не видна снаружи, поэтому будет ошибка в последнем `alert`.
@@ -117,7 +136,7 @@ alert( i ); // ошибка, переменная не определена
117
136
</li>
118
137
<li>**При использовании в цикле, для каждой итерации создаётся своя переменная.**
119
138
120
-
Переменная `var` -- одна на все итерации цикла (и видна после цикла):
139
+
Переменная `var` -- одна на все итерации цикла и видна даже после цикла:
С переменной `let` -- всё по-другому. Добавляется ещё одна область видимости: блок цикла.
148
+
С переменной `let` -- всё по-другому.
130
149
131
-
Каждому блоку цикла соответствует своя, независимая, переменная `let`. Если внутри цикла объявляются функции, то в замыкании каждой будет та переменная, которая была при итерации.
150
+
Каждому повторению цикла соответствует своя независимая переменная `let`. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.
132
151
133
152
Это позволяет легко решить классическую проблему с замыканиями, описанную в задаче [](/task/make-army).
134
153
@@ -183,7 +202,7 @@ apple = 10; // ошибка
183
202
<ul>
184
203
<li>Видны только после объявления и только в текущем блоке.</li>
185
204
<li>Нельзя переобъявлять (в том же блоке).</li>
186
-
<li>В цикле каждое значение `let` принадлежит конкретной итерации цикла (и видно в замыканиях).</li>
205
+
<li>При объявлении переменной в цикле `for(let …)` -- она видна только в этом цикле. Причём каждой итерации соответствует своя переменная `let`.</li>
187
206
</ul>
188
207
189
208
Переменная `const` -- это константа, в остальном -- как `let`.
0 commit comments