<commit_before>---
layout: post
title:  "Возможности ES6"
date:   2015-02-19 21:46:04
categories: javascript
---
{% newthought 'ES6 -' %} новый(хотя в целом уже не) стандарт Javascript. Наконец нашел время пройтись по фичам, и выбрать то, что буду юзать уже сейчас.<!--more-->  Выбирал по ссылкам с подборкой этих фич: [один](http://es6-features.org/#RawStringAccess) и [два](https://github.com/lukehoban/es6features).

<!-- странная статья, немного не про то вообще -  Также полезно для прочтения: <http://habrahabr.ru/post/216997/> , -->
Итак:

1. **Let и const**. Let - для области видимости как С\С++(раньше в js все переменные переносились к началу функции). Const - просто неизменяемая константа.

Достаточно простые вещи, которые только делают поведение js более ожидаемым.

Например, в этой функции x будет виден только в блоке if(true), и не будет за его пределами
function f() {
  {
    if (true) {
let x;
{
// okay, block scoped name
const x = "sneaky";
// error, const
x = "foo";
}
// error, already declared in block
let x = "inner";
    }
  }
}

также по поводу let из https://leanpub.com/understandinges6/read/ :

Using let in loops
The behavior of let inside of loops is slightly different than with other blocks. Instead of creating a variable that is used with each iteration of the loop, each iteration actually gets its own variable to use. This is to solve an old problem with JavaScript loops. Consider the following:

 var funcs = [];

 for (var i=0; i < 10; i++) {
     funcs.push(function() { console.log(i); });
 }

 funcs.forEach(function(func) {
     func();     // outputs the number "10" ten times
 });
This code will output the number 10 ten times in a row. That’s because the variable i is shared across each iteration of the loop, meaning the closures created inside the loop all hold a reference to the same variable. The variable i has a value of 10 once the loop completes, and so that’s the value each function outputs.

To fix this problem, developers use immediately-invoked function expressions (IIFEs) inside of loops to force a new copy of the variable to be created:

 var funcs = [];

 for (var i=0; i < 10; i++) {
     funcs.push((function(value) {
         return function() {
             console.log(value);
         }
     }(i)));
 }

 funcs.forEach(function(func) {
     func();     // outputs 0, then 1, then 2, up to 9
 });
This version of the example uses an IIFE inside of the loop. The i variable is passed to the IIFE, which creates its own copy and stores it as value. This is the value used of the function for that iteration, so calling each function returns the expected value.

A let declaration does this for you without the IIFE. Each iteration through the loop results in a new variable being created and initialized to the value of the variable with the same name from the previous iteration. That means you can simplify the process by using this code:
<commit_msg>Updated 2015-08-25-features-of-es6.md<commit_after>---
layout: post
title: Возможности ES6
date: {}
categories: javascript
published: true
---

{% newthought 'ES6 -' %} новый(хотя в целом уже не) стандарт Javascript. Наконец нашел время пройтись по фичам, и выбрать то, что буду юзать уже сейчас.<!--more-->  Выбирал по ссылкам с подборкой этих фич: [один](http://es6-features.org/#RawStringAccess) и [два](https://github.com/lukehoban/es6features).

<!-- странная статья, немного не про то вообще -  Также полезно для прочтения: <http://habrahabr.ru/post/216997/> , -->
Итак:

1. **Let и const**. Let - для области видимости как С\С++(раньше в js все переменные переносились к началу функции). Const - просто неизменяемая константа.

Достаточно простые вещи, которые только делают поведение js более ожидаемым.

Например, в этой функции x будет виден только в блоке if(true), и не будет за его пределами
{% highlight javascript %}
function f() {
  {
    if (true) {
let x;
{
// okay, block scoped name
const x = "sneaky";
// error, const
x = "foo";
}
// error, already declared in block
let x = "inner";
    }
  }
}
{% endhighlight %}

также по поводу let из https://leanpub.com/understandinges6/read/:

**Using let in loops**
The behavior of let inside of loops is slightly different than with other blocks. Instead of creating a variable that is used with each iteration of the loop, each iteration actually gets its own variable to use. This is to solve an old problem with JavaScript loops. Consider the following:

{% highlight javascript %}
 var funcs = [];

 for (var i=0; i < 10; i++) {
     funcs.push(function() { console.log(i); });
 }

 funcs.forEach(function(func) {
     func();     // outputs the number "10" ten times
 });
{% endhighlight %}

This code will output the number 10 ten times in a row. That’s because the variable i is shared across each iteration of the loop, meaning the closures created inside the loop all hold a reference to the same variable. The variable i has a value of 10 once the loop completes, and so that’s the value each function outputs.

To fix this problem, developers use immediately-invoked function expressions (IIFEs) inside of loops to force a new copy of the variable to be created:

 var funcs = [];

 for (var i=0; i < 10; i++) {
     funcs.push((function(value) {
         return function() {
             console.log(value);
         }
     }(i)));
 }

 funcs.forEach(function(func) {
     func();     // outputs 0, then 1, then 2, up to 9
 });
This version of the example uses an IIFE inside of the loop. The i variable is passed to the IIFE, which creates its own copy and stores it as value. This is the value used of the function for that iteration, so calling each function returns the expected value.

A let declaration does this for you without the IIFE. Each iteration through the loop results in a new variable being created and initialized to the value of the variable with the same name from the previous iteration. That means you can simplify the process by using this code:

{'fraction_non_alphanumeric': 0.09154811715481172, 'fraction_numerical': 0.013221757322175733, 'mean_word_length': 3.565317035905271, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 9, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6120636', 'n_tokens_mistral': 1887, 'n_tokens_neox': 1886, 'n_words': 837}