Skip to content

Commit

Permalink
es6
Browse files Browse the repository at this point in the history
  • Loading branch information
iliakan committed Jul 12, 2015
1 parent 43dfa40 commit 413e552
Show file tree
Hide file tree
Showing 5 changed files with 186 additions and 110 deletions.
14 changes: 1 addition & 13 deletions 1-js/10-es-modern/1-es-modern-usage/article.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
# ES-2015 сейчас

[smart header="Этот раздел -- в активной разработке"]
Стандарт ES-2015 недавно был принят окончательно, и этот раздел находится в ежедневной разработке.

[/smart]

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

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

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

Рекомендуется [Chrome Canary](https://www.google.com/chrome/browser/canary.html), Edge или [Firefox Developer Edition](https://www.mozilla.org/en-US/firefox/channel/#developer).
Рекомендуется [Chrome Canary](https://www.google.com/chrome/browser/canary.html), Edge или [Firefox Developer Edition](https://www.mozilla.org/en-US/firefox/channel/#developer), большинство примеров в них работает.

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

Expand All @@ -78,10 +73,3 @@

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








43 changes: 31 additions & 12 deletions 1-js/10-es-modern/2-let-const/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@ let a = 5;

## let

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

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

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

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

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

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

То же самое с `let` будет работать по-другому:

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

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

Заметим, что если объявление `apples` в строке `(*)` закомментировать, то в последнем `alert` будет ошибка: переменная неопределена. Это потому что переменная `let` всегда видна именно в том блоке, где объявлена и не более.
Заметим, что если объявление `let apples` в первой строке `(*)` удалить, то в последнем `alert` будет ошибка: переменная неопределена:

```js
//+ run
'use strict';

if (true) {
let apples = 10;

alert(apples); // 10 (внутри блока)
}

*!*
alert(apples); // ошибка!
*/!*
```


Это потому что переменная `let` всегда видна именно в том блоке, где объявлена, и не более.

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

Это -- хоть и выглядит ограничением по сравнению с `var`, но на самом деле проблем не создаёт, так как область видимости ограничена блоком.

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

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

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

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

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

```js
//+ run
Expand All @@ -126,9 +145,9 @@ for(var i=0; i<10; i++) { /* … */ }
alert(i); // 10
```

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

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

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

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

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

0 comments on commit 413e552

Please sign in to comment.