var vs let
Last updated
Last updated
У объявлений переменной через 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
создаёт для каждого повторения блока в цикле свою переменную, которую функция и получает из замыкания в последних строках.