Skip to content

Commit 413e552

Browse files
committed
es6
1 parent 43dfa40 commit 413e552

5 files changed

Lines changed: 186 additions & 110 deletions

File tree

1-js/10-es-modern/1-es-modern-usage/article.md

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
# ES-2015 сейчас
22

3-
[smart header="Этот раздел -- в активной разработке"]
4-
Стандарт ES-2015 недавно был принят окончательно, и этот раздел находится в ежедневной разработке.
5-
6-
[/smart]
7-
83
[Стандарт ES-2015](http://www.ecma-international.org/publications/standards/Ecma-262.htm) был принят в июне 2015. Пока что большинство браузеров реализуют его частично, текущее состояние реализации различных возможностей можно посмотреть здесь: [](https://kangax.github.io/compat-table/es6/).
94

105
Когда стандарт будет более-менее поддерживаться во всех браузерах, то весь учебник будет обновлён в соответствии с ним. Пока же, как центральное место для "сбора" современных фич JavaScript, создан этот раздел.
@@ -68,7 +63,7 @@
6863

6964
Это означает, что при запуске примеров в браузере, который их не поддерживает, будет ошибка. Это не означает, что пример неправильный! Просто пока нет поддержки...
7065

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), большинство примеров в них работает.
7267

7368
Впрочем, если пример в браузере не работает (обычно проявляется как ошибка синтаксиса) -- почти все примеры вы можете запустить его при помощи Babel, на странице [Babel: try it out](https://babeljs.io/repl/). Там же увидите и преобразованный код.
7469

@@ -78,10 +73,3 @@
7873

7974
Итак, поехали!
8075

81-
82-
83-
84-
85-
86-
87-

1-js/10-es-modern/2-let-const/article.md

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ let a = 5;
99

1010
## let
1111

12-
У объявлений `let` три основных отличия от `var`:
12+
У объявлений переменной через `let` есть три основных отличия от `var`:
1313

1414
<ol>
1515
<li>**Область видимости переменной `let` -- блок `{...}`.**
1616

17-
Как мы помним, переменная, объявленная через `var`, видна везде в функции. В старом стандарте минимальная "область видимости" -- функция.
17+
Как мы помним, переменная, объявленная через `var`, видна везде в функции.
1818

1919
Переменная, объявленная через `let`, видна только в рамках блока `{...}`, в котором объявлена.
2020

@@ -37,7 +37,9 @@ if (true) {
3737
alert(apples); // 10 (снаружи блока то же самое)
3838
```
3939

40-
То же самое с `let`:
40+
В примере выше `apples` -- одна переменная на весь код, которая модифицируется в `if`.
41+
42+
То же самое с `let` будет работать по-другому:
4143

4244
```js
4345
//+ run
@@ -58,7 +60,25 @@ alert(apples); // 5 (снаружи блока значение не измен
5860

5961
Здесь, фактически, две независимые переменные `apples`, одна -- глобальная, вторая -- в блоке `if`.
6062

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` всегда видна именно в том блоке, где объявлена, и не более.
6282

6383
</li>
6484
<li>**Переменная `let` видна только после объявления.**
@@ -98,17 +118,16 @@ let x;
98118
let x; // ошибка: переменная x уже объявлена
99119
```
100120

101-
Это -- хоть и выглядит ограничением по сравнению с `var`, но на самом деле проблем не создаёт, так как область видимости ограничена блоком.
102-
103-
Например, два таких цикла совсем не конфликтуют:
121+
Это -- хоть и выглядит ограничением по сравнению с `var`, но на самом деле проблем не создаёт. Например, два таких цикла совсем не конфликтуют:
104122
```js
105123
//+ run
106124
'use strict';
107125

126+
// каждый цикл имеет свою переменную i
108127
for(let i = 0; i<10; i++) { /**/ }
109128
for(let i = 0; i<10; i++) { /**/ }
110129

111-
alert( i ); // ошибка, переменная не определена
130+
alert( i ); // ошибка: глобальной i нет
112131
```
113132

114133
При объявлении внутри цикла переменная `i` будет видна только в блоке цикла. Она не видна снаружи, поэтому будет ошибка в последнем `alert`.
@@ -117,7 +136,7 @@ alert( i ); // ошибка, переменная не определена
117136
</li>
118137
<li>**При использовании в цикле, для каждой итерации создаётся своя переменная.**
119138

120-
Переменная `var` -- одна на все итерации цикла (и видна после цикла):
139+
Переменная `var` -- одна на все итерации цикла и видна даже после цикла:
121140

122141
```js
123142
//+ run
@@ -126,9 +145,9 @@ for(var i=0; i<10; i++) { /* … */ }
126145
alert(i); // 10
127146
```
128147

129-
С переменной `let` -- всё по-другому. Добавляется ещё одна область видимости: блок цикла.
148+
С переменной `let` -- всё по-другому.
130149

131-
Каждому блоку цикла соответствует своя, независимая, переменная `let`. Если внутри цикла объявляются функции, то в замыкании каждой будет та переменная, которая была при итерации.
150+
Каждому повторению цикла соответствует своя независимая переменная `let`. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.
132151

133152
Это позволяет легко решить классическую проблему с замыканиями, описанную в задаче [](/task/make-army).
134153

@@ -183,7 +202,7 @@ apple = 10; // ошибка
183202
<ul>
184203
<li>Видны только после объявления и только в текущем блоке.</li>
185204
<li>Нельзя переобъявлять (в том же блоке).</li>
186-
<li>В цикле каждое значение `let` принадлежит конкретной итерации цикла (и видно в замыканиях).</li>
205+
<li>При объявлении переменной в цикле `for(let …)` -- она видна только в этом цикле. Причём каждой итерации соответствует своя переменная `let`.</li>
187206
</ul>
188207

189208
Переменная `const` -- это константа, в остальном -- как `let`.

0 commit comments

Comments
 (0)