Что такое Var?

Когда-то var было единственным ключевым словом для объявления переменных. var переменные ограничены функцией. Если он не объявлен внутри функции, он становится глобальным. var переменные также могут быть переобъявлены. Значение будет установлено на последнее объявление. Давайте посмотрим на пример кода:

var varVariable = 'This is a Var variable'
console.log(varVariable) //This is a Var variable
const varFunction = () => {
  console.log(varVariable) //This is a Var variable
}
varFunction()
var varVariable = "This is same Var reassigned"
console.log(varVariable) //This is same Var reassigned
varVariable = "This is same Var without var keyword"
console.log(varVariable) //This is same Var without var keyword

Недостатком использования var является то, что он открывает сценарии, в которых вы можете неосознанно использовать одно и то же имя переменной, что приводит к неожиданным результатам.

Что такое Пусть?

let — это улучшение объявления var. let имеет заблокированную область действия, что означает, что он будет ограничен {}. Другими словами, переменная будет доступна только внутри блока {}. let переменные также могут быть объявлены в глобальной области видимости. Давайте посмотрим на пример кода:

const firstFunction = () => {
  let letVariable = "This is a Let variable";
  console.log(letVariable); //This is a Let variable
};
firstFunction();
const secondFunction = () => {
  console.log(letVariable); //ReferenceError letVariable is not defined
};
secondFunction();

secondFunction приведет к ошибке ссылки, потому что letVariable не объявлено в функциональных скобках {}.

Также важно отметить, что let нельзя повторно объявить. Следующий код приведет к ошибке:

let letVariable = "This is a Let variable"
let letVariable = "This is a Let variable again"

Что такое Конст?

const почти точно такое же, как let. Одно ключевое отличие состоит в том, что const нельзя присвоить другое значение.

let letVariable = "This is a let variable";
console.log(letVariable); //This is a let variable
letVariable = "Change to let variable";
console.log(letVariable); //Change to let variable
const constVariable = "This is a const variable";
console.log(constVariable);  //This is a const variable
constVariable = "Change to const variable";
console.log(constVariable);  //TypeError: Assignment to constant variable.

Однако, если const является объектом, свойства внутри могут быть изменены. Но его нельзя переназначить другому объекту. Давайте посмотрим на пример:

const person = { name: "Jon", age: 100 };
console.log(person); //{ name: 'Jon', age: 100 }
person.age = 1;
console.log(person); //{ name: 'Jon', age: 1 }
// Try to assign person to a new object.
person = { name: "Joanne", age: 50 };
console.log(person); //TypeError: Assignment to constant variable.

Подъем

Еще одна важная вещь, которую следует учитывать, — это то, как эти типы переменных поднимаются. Поднятие — это концепция, при которой (во время компиляции) объявления переменных и функций перемещаются в верхнюю часть содержащих областей. В то время как var, let и const поднимаются наверх, только var инициализируется undefined. Это означает, что вы можете получить доступ к var до его объявления, но вы не можете получить доступ к let, const переменным до объявления. Давайте посмотрим на пример:

console.log(varVariable); //undefined
var varVariable = "This is a var variable"
console.log(varVariable); //This is a var variable
console.log(letVariable); //ReferenceError: Cannot access 'letVariable' before initialization
let letVariable = "This is a let variable"
console.log(letVariable); //This is a var variable

Смущен, почему первый console.log(varVariable) не определен? Вот что делает подъем.

Этот:

console.log(varVariable); //undefined
var varVariable = "This is a var variable"

Интерпретируется так:

var varVariable; //initialized to undefined
console.log(varVariable); //undefined
varVariable = "This is a var variable"

И это:

console.log(letVariable);
let letVariable = "This is a let variable"

Интерпретируется так:

let letVariable; //not initialized to anything
console.log(letVariable); //ReferenceError: Cannot access 'letVariable' before initialization
letVariable = "This is a let variable"