В ES5 переменные декларировались с помощью var. Переменные объявленные таким образом, могут быть переопределены в области блока, так как относятся к области видимости функции, а не блока.
В ES6 появились два новых способа декларирования переменных, с помощью const и let, которые позволяют создавать переменные области видимости блока.
Отличие let от const в том, что переменная декларированная с помощью let может быть переопределена. В случае декларирования переменной с помощью const её последующее переопределение невозможно.
С помощью let и const переменная может быть объявлена только единственный раз. Попытка последующей декларации переменной с таким же именем вызовет ошибку. При декларации с помощью var данное правило не действует:
Стандарт ECMAScript 6 (новый набор возможностей JavaScript, известный ещё как ES6 и ES2015) даёт нам два новых способа объявления переменных, отличающихся ограниченной, по сравнению с var, областью видимости и имеющих ещё некоторые особенности. Это — ключевые слова let и const. И то и другое даёт нам так называемую блочную область видимости. Это означает, что область видимости при их использовании может быть ограничена блоком кода, таким, как цикл for или выражение if.
Ключевое слово let очень похоже на var, основное отличие — ограниченная область видимости переменных, объявляемых с его помощью.
Ключевое слово const очень похоже на let, но у них есть одно важное различие. Это ключевое слово используется для объявления констант. Значения констант после их инициализации менять нельзя. Нужно отметить, что это относится лишь к значениям примитивных типов, воде строки или числа. Если константа является чем-то более сложным, например — объектом или массивом, внутреннюю структуру подобной сущности модифицировать можно, нельзя лишь заменить её саму на другую.