11LetConst.md 3.5 KB

ES6: 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

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)
}