Skip to content

Commit b847d31

Browse files
committed
starting es6
1 parent 8ebc0b7 commit b847d31

File tree

6 files changed

+215
-3
lines changed

6 files changed

+215
-3
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# ES-2015 сейчас
2+
3+
[Стандарт ES-2015](http://www.ecma-international.org/publications/standards/Ecma-262.htm) был принят в июне 2015. Пока что большинство браузеров реализуют его частично, текущее состояние реализации различных возможностей можно посмотреть здесь: [](https://kangax.github.io/compat-table/es6/), поэтому в этом учебнике ему выделена отдельная секция.
4+
5+
Когда стандарт будет поддерживаться почти целиком везде, то весь учебник будет обновлён в соответствии с ним.
6+
7+
Пока же, чтобы писать код на ES-2015, есть следующие варианты.
8+
9+
## Конкретный движок JS
10+
11+
Самое простое -- это когда нужен один конкретный движок JS, например V8 (Chrome).
12+
13+
Тогда можно использовать только то, что поддерживается именно в нём. Заметим, что в V8 большинство возможностей ES-2015 поддерживаются только при включённом `use strict`.
14+
15+
При разработке на Node.JS обычно так и делают. Если же нужна кросс-браузерная поддержка, то этот вариант не подойдёт.
16+
17+
## Babel.JS
18+
19+
[Babel.JS](https://babeljs.io) -- это [транспайлер](https://en.wikipedia.org/wiki/Source-to-source_compiler), переписывающий код на ES-2015 в код на предыдущем стандарте ES5.
20+
21+
Он состоит из двух частей:
22+
23+
<ol>
24+
<li>Собственно транспайлер, который переписывает код.</li>
25+
<li>Полифилл, который добавляет методы `Array.from`, `String.prototype.repeat` и другие.</li>
26+
</ol>
27+
28+
На странице [](https://babeljs.io/repl/) можно поэкспериментировать с транспайлером: слева вводится код в ES-2015, а справа появляется результат его преобразования в ES5.
29+
30+
Обычно Babel.JS работает на сервере в составе системы сборки JS-кода (например [webpack](http://webpack.github.io/) или [brunch](http://brunch.io/)) и автоматически переписывает весь код в ES5.
31+
32+
Настройка такой конвертации тривиальна, единственно -- нужно поднять саму систему сборки, а добавить к ней Babel легко, плагины есть к любой из них.
33+
34+
Если же хочется "поиграться", то можно использовать и браузерный вариант Babel.
35+
36+
Это выглядит так:
37+
38+
```html
39+
<!--+ run -->
40+
*!*
41+
<!-- browser.js лежит на моём сервере, не надо брать с него -->
42+
<script src="https://js.cx/babel-core/browser.min.js"></script>
43+
*/!*
44+
45+
<script type="text/babel">
46+
let arr = ["hello", 2]; // let
47+
48+
let [str, times] = arr; // деструктуризация
49+
50+
alert( str.repeat(times) ); // hellohello, метод repeat
51+
</script>
52+
```
53+
54+
Сверху подключается браузерный скрипт `browser.min.js` из пакета Babel. Он включает в себя полифилл и транспайлер. Далее он автоматически транслирует и выполняет скрипты с `type="text/babel"`.
55+
56+
Размер `browser.min.js` превышает 1 мегабайт, поэтому такое использование в production строго не рекомендуется.
57+
58+
# Примеры на этом сайте
59+
60+
На этом сайте запускаемые примеры гарантированно работают в [последнем Chrome](https://www.google.com/chrome/browser/canary.html), браузерный Babel не используется, при желании вы можете запустить их в любом браузере вместе с Babel, как показано выше.
61+
62+
Ещё раз заметим, что самая актуальная ситуация по поддержке современного стандарта браузерами отражена вот тут: [](https://kangax.github.io/compat-table/es6/).
63+
64+
65+
66+
67+
68+
69+
70+
71+
72+
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
# Переменные: let и const
2+
3+
В ES-2015 предусмотрены новые способы объявления переменных: через `let` и `const` вместо `var`.
4+
5+
Например:
6+
```js
7+
let a = 5;
8+
```
9+
10+
## let
11+
12+
У объявлений `let` три основных отличия от `var`:
13+
14+
<ol>
15+
<li>**Область видимости переменной `let` -- блок `{...}`.**
16+
17+
Как мы помним, переменная, объявленная через `var`, видна везде в функции. В старом стандарте минимальная "область видимости" -- функция.
18+
19+
Переменная, объявленная через `let`, видна только в рамках блока `{...}`, в котором объявлена.
20+
21+
Это, в частности, влияет на объявления внутри `if`, `while` или `for`.
22+
23+
Например, переменная через `var`:
24+
25+
```js
26+
//+ run
27+
'use strict';
28+
29+
var apples = 5;
30+
31+
if (true) {
32+
var apples = 10;
33+
34+
alert(apples); // 10 (внутри блока)
35+
}
36+
37+
alert(apples); // 10 (снаружи блока то же самое)
38+
```
39+
40+
То же самое с `let`:
41+
42+
```js
43+
//+ run
44+
'use strict';
45+
46+
let apples = 5; // (*)
47+
48+
if (true) {
49+
let apples = 10;
50+
51+
alert(apples); // 10 (внутри блока)
52+
}
53+
54+
*!*
55+
alert(apples); // 5 (снаружи блока значение не изменилось)
56+
*/!*
57+
```
58+
59+
Здесь, фактически, две независимые переменные `apples`, одна -- глобальная, вторая -- в блоке `if`.
60+
61+
Заметим, что если объявление `apples` в строке `(*)` закомментировать, то в последнем `alert` будет ошибка: переменная неопределена. Это потому что переменная `let` всегда видна именно в том блоке, где объявлена и не более.
62+
63+
</li>
64+
<li>**Переменная `let` не видна до объявления.**
65+
66+
Как мы помним, переменные `var` существуют и до объявления. Они равны `undefined`:
67+
68+
```js
69+
//+ run
70+
'use strict';
71+
72+
alert(a); // undefined
73+
74+
var a = 5;
75+
```
76+
77+
С переменными `let` всё проще. До объявления их вообще нет.
78+
79+
Такой доступ приведёт к ошибке:
80+
```js
81+
//+ run
82+
'use strict';
83+
84+
*!*
85+
alert(a); // ошибка, нет такой переменной
86+
*/!*
87+
88+
let a = 5;
89+
```
90+
</li>
91+
<li>**При использовании в цикле, для каждой итерации создаётся своя переменная.**
92+
93+
Объявление `let` позволяет легко решить классическую проблему с замыканиями, описанную в задаче [](/task/make-army).
94+
95+
```js
96+
//+ run
97+
'use strict';
98+
99+
function makeArmy() {
100+
101+
let shooters = [];
102+
103+
for (*!*let*/!* i = 0; i < 10; i++) {
104+
shooters.push(function() {
105+
alert( i ); // выводит свой номер
106+
});
107+
}
108+
109+
return shooters;
110+
}
111+
112+
var army = makeArmy();
113+
114+
army[0](); // 0
115+
army[5](); // 5
116+
```
117+
118+
Если бы объявление было `var i`, то была бы одна переменная `i` на всю функцию, и вызовы в последних строках выводили бы `10` (подробнее -- см. задачу [](/task/make-army)).
119+
120+
Объявление `let i` создаёт для каждого повторения блока в цикле свою переменную.
121+
</li>
122+
</ol>
123+
124+
# const
125+
126+
По области видимости -- это то же самое, что `let`, но константа, нельзя менять:
127+
128+
```js
129+
//+ run
130+
'use strict';
131+
132+
const apple = 5;
133+
apple = 10; // ошибка
134+
```
135+
136+
137+

1-js/10-es-modern/3-promise/article.md

Whitespace-only changes.

1-js/10-es-modern/index.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Современные возможности ES-2015
2+
3+
Современный стандарт ES-2015 и его расширения для JavaScript.
4+

1-js/5-functions-closures/4-closures-usage/6-make-army/solution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ for (var i = 0; i < 10; i++) {
114114
Если использовать Named Function Expression, то имя жёстко привязывается к конкретной функции, и поэтому в коде выше `me.i` возвращает правильный `i`.
115115

116116
</li>
117-
<li>**Другое, более продвинутое решение --- использовать дополнительную функцию для того, чтобы "поймать" текущее значение `i`**:
117+
<li>**Другое, более продвинутое решение -- использовать дополнительную функцию для того, чтобы "поймать" текущее значение `i`**:
118118

119119
```js
120120
//+ run

1-js/5-functions-closures/4-closures-usage/article.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ alert( counter() ); // 5
120120

121121
Этот трюк часто используется при разработке JavaScript-библиотек. Например, популярная библиотека [jQuery](http://jquery.com) предоставляет глобальную переменную с именем [jQuery](http://api.jquery.com/jQuery/) (доступна также под коротким именем `$`), которая с одной стороны является функцией и может вызываться как `jQuery(...)`, а с другой -- у неё есть различные методы, например `jQuery.type(123)` возвращает тип аргумента.
122122

123-
124-
## Задачи на понимание замыканий
123+
Далее вы найдёте различные задачи на понимание замыканий. Рекомендуется их сделать самостоятельно.
125124

126125

0 commit comments

Comments
 (0)