var vs let
У объявлений переменной через let
есть три основных отличия от var
:
Область видимости переменной
let
– блок{...}
.Как мы помним, переменная, объявленная через
var
, видна везде в функции.Переменная, объявленная через
let
, видна только в рамках блока{...}
, в котором объявлена.Это, в частности, влияет на объявления внутри
if
,while
илиfor
.Например, переменная через
var
:В примере выше
apples
– одна переменная на весь код, которая модифицируется вif
.То же самое с
let
будет работать по-другому:Здесь, фактически, две независимые переменные
apples
, одна – глобальная, вторая – в блокеif
.Заметим, что если объявление
let apples
в первой строке(*)
удалить, то в последнемalert
будет ошибка: переменная не определена:Это потому что переменная
let
всегда видна именно в том блоке, где объявлена, и не более.Переменная
let
видна только после объявления.Как мы помним, переменные
var
существуют и до объявления. Они равныundefined
:С переменными
let
всё проще. До объявления их вообще нет.Такой доступ приведёт к ошибке:
Заметим также, что переменные
let
нельзя повторно объявлять. То есть, такой код выведет ошибку:Это – хоть и выглядит ограничением по сравнению с
var
, но на самом деле проблем не создаёт. Например, два таких цикла совсем не конфликтуют:При объявлении внутри цикла переменная
i
будет видна только в блоке цикла. Она не видна снаружи, поэтому будет ошибка в последнемalert
.При использовании в цикле, для каждой итерации создаётся своя переменная.
Переменная
var
– одна на все итерации цикла и видна даже после цикла:С переменной
let
– всё по-другому.Каждому повторению цикла соответствует своя независимая переменная
let
. Если внутри цикла есть вложенные объявления функций, то в замыкании каждой будет та переменная, которая была при соответствующей итерации.Это позволяет легко решить классическую проблему с замыканиями, описанную в задаче Армия функций.
Если бы объявление было
var i
, то была бы одна переменнаяi
на всю функцию, и вызовы в последних строках выводили бы10
.А выше объявление
let i
создаёт для каждого повторения блока в цикле свою переменную, которую функция и получает из замыкания в последних строках.
Last updated