# ES6: `let` и `const` ## Область видимости. `let` изначально был придуман во всяких (прастигоспади) `lisp`-диалектах, и суть его заключалась в следующем: определить свой набор переменных и значений для блока кода, т. е. создать область видимости и код, который имеет доступ к этой области видимости. В отличие от **функций**, такая область видимости и блок кода запускаются не по **вызову**, а по порядку исполнения (как обычный код, выполняемый сверху вниз): ```javascript var x = 10; { let x = 15; console.log('let x: ' + x); } console.log('var x: ' + x); ``` В примере выше применяется *просто блок* кода, однако вы можете использовать `let` для определения локальной переменной в *любом* блоке кода (`if`, `function`, `for`, `while`, и т. п.) ## `Self-Invoked Function` Классический в **ES5** подход **Self-Invoked Function**, является костылём для реализации обычного исконного поведения `let`. Например, аналог примера выше выглядит в синтаксисе **ES5** так: ```javascript var x = 10; (function() { var x = 15; console.log('self-invoked x: ' + x); })() console.log('var x: ' + x); ``` ## Объявление переменных через `let`. В отличие от `var`, переменную через `let` нельзя переопределять в том же блоке кода. Определения `var` *всплывают*, `let` же - нет. ## `let` и циклы `let` в циклах ведет себя как переменная внутри `Self-Invoked Function`, создаваемой на каждую итерацию, и вмещающей в себя весь итерируемый блок кода: ```javascript for (let i=0;i<6;i++){ setTimeout(() => console.log(i),i*1000) //ведет себя так, как вы хотите :-D } ``` То есть на *каждую итерацию* создается **своя копия** переменной В синтаксисе **ES5** это выглядит так: ```javascript for (var _=0;_<6;_++){ (function(i){ setTimeout(() => console.log(i),i*1000) //ведет себя так, как вы хотите :-D })(_) } ``` Однако после цикла с `let` переменной не будет (с `var` же она останется) ## Замыкание простейшее замыкание *без внешней функции* реализуется с помощью `let` следующим образом: ```javascript var x = 10; { let x = 15; var closureFunc = function(){ return x; } } console.log(x) console.log(closureFunc()) ``` ## Const `Const` - это определение константы. Работает так же, как и `let`, однако значение менять нельзя: ```javascript let R = 1; let warTime = true; if (warTime){ const PI = 4 console.log(2*PI*R) } else { const PI = Math.PI console.log(2*PI*R) } ```