let
и const
let
изначально был придуман во всяких (прастигоспади) lisp
-диалектах, и суть его заключалась в следующем: определить свой набор переменных и значений для блока кода, т. е. создать область видимости и код, который
имеет доступ к этой области видимости. В отличие от функций, такая область видимости и блок кода запускаются не по вызову, а по порядку исполнения (как обычный код, выполняемый сверху вниз):
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 так:
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
, создаваемой на каждую итерацию, и вмещающей в себя весь итерируемый блок кода:
for (let i=0;i<6;i++){
setTimeout(() => console.log(i),i*1000) //ведет себя так, как вы хотите :-D
}
То есть на каждую итерацию создается своя копия переменной
В синтаксисе ES5 это выглядит так:
for (var _=0;_<6;_++){
(function(i){
setTimeout(() => console.log(i),i*1000) //ведет себя так, как вы хотите :-D
})(_)
}
Однако после цикла с let
переменной не будет (с var
же она останется)
простейшее замыкание без внешней функции реализуется с помощью let
следующим образом:
var x = 10;
{
let x = 15;
var closureFunc = function(){
return x;
}
}
console.log(x)
console.log(closureFunc())
Const
- это определение константы. Работает так же, как и let
, однако значение менять нельзя:
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)
}