До ES 5 у нас был один способ объявления переменных, то есть использование ключевого слова var.

var a;

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

for (var i = 0; i < 10 ; i++){
console.log(i); // 0 to 9
}console.log("Outside"); // Outside
console.log(i); // 10

Внутри приведенного ниже фрагмента кода var i объявляется внутри функции и будет соответствовать области действия функции. Следовательно, он не будет доступен вне функции.

function test(){
  for (var i = 0; i < 10 ; i++){
  console.log(i); // 0 to 9
  }
  console.log("Loop Ends"); // Loop Ends
  console.log(i); // 10
}
test();
console.log("Outside"); // Outside
console.log(i); // Uncaught ReferenceError: i is not defined

Проблема с варом?

глобальная область действия или функция/локальная область действия

varпеременные могут быть повторно объявлены и обновлены внутри одной и той же области действия, и это не вызовет ошибки.

function test(){
  var a =10;
  console.log(a);  // 10
  if(true){
    var a=20;
    console.log(a); // 20
  }
  console.log(a);  // 20
}

var поднят —переменные var могут быть подняты. Перейдите по этой ссылке, чтобы узнать о подъеме. Это делается для того, чтобы убедиться, что они объявили переменные до того, как получили значение. Но также для предотвращения глобального доступа к переменным.

console.log (i);
var i = 10 // Undefined Error

i переопределяется на 10. Это не проблема, если вы хотите переопределить i, но это становится проблемой, когда вы не понимаете, что переменная i уже была определена.
Если вы использовали i в других частях вашего кода, вы можете быть удивлены полученным результатом. Это может привести к множеству ошибок в вашем коде.

Переобъявление снова —с помощью var мы можем повторно объявить переменные.

var i = 10;
console.log (i); // 10
var i = 20;
console.log (i); // 20

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

var i = 10;
console.log (i); // 10
function test(){
  i = 'Aastha';
  console.log (i); // Aastha
}
test()

Дает undefined- использование переменной var без определения и объявления дает undefined.

console.log(i); // undefined
var i = 10;

А вот пусть и const

позволять

В ES6 Let и const появились как улучшение объявлений var. Это также решает проблему масштабирования.

Let имеет область действия блока. Блок определяется {}. Таким образом, переменная, объявленная в блоке с let, доступна для использования только внутри этого блока.

for (let i = 0; i < 10 ; i++){
console.log(i); // 0 to 9
}
console.log("Outside"); // Outside
console.log(i); // Uncaught ReferenceError: i is not defined

Если let определен внутри функции, он будет работать так же, как var внутри функции. Следите за областью действия.

function test(){
  for (var i = 0; i < 10 ; i++){
  console.log(i); // 0 to 9
  }
}
test();
console.log("Outside");
console.log(i); // Uncaught ReferenceError: i is not defined

Пусть переменные не могут быть подняты.

i = 10;
console.log(i); // Uncaught ReferenceError: i is not defined
let i;

Разрешить обновление переменных, но их нельзя повторно объявить.

let i = 10;
i =20;
console.log(i); // 20 
let i =30;
console.log(i); // Uncaught SyntaxError: Identifier 'i' has already been declared

Uncaught ReferenceError – использование переменной var без определения и объявления приводит к ошибке Uncaught Reference Error.

console.log(i);
let i = 10; // Uncaught ReferenceError: i is not defined

константа

const — это сокращение от константа. Переменные, назначенные ключевым словом const, не могут обновляться или повторно объявляться. Они доступны только для чтения.

const i = 10;
i = 1; 
console.log(i); // TypeError: Assignment to constant variable.

Но мы можем обновить константный объект.

const i = {
    Name : "Aastha",
    Age : 21
}
console.log(i);  // {Name: "Aastha", Age: 21} i.Name = "Aastha Gupta"
i.Age = 23 
console.log(i);// {Name: "Aastha Gupta", Age: 23}

Оставлять инициализацию нельзя, они должны быть инициализированы в момент объявления

const i;
console.log(i);
// SyntaxError: Missing initializer in const declaration

Const следует за областью блока

if (true) {
  const i = 10;
}
console.log(i); // ReferenceError: i is not defined

переменная const не может быть поднята

i = 10;
console.log(i); // Uncaught ReferenceError: i is not defined
const i;

Uncaught ReferenceError – использование переменной var без определения и объявления приводит к ошибке Uncaught Reference Error.

console.log(i);
const i = 10; // Uncaught ReferenceError: i is not defined

Вот и все!!!