В чем отличие var от const, let?angular-7

1. Область видимости

var — функциональная область видимости

function exampleVar() {
  if (true) {
    var x = 10; // Видна во всей функции!
  }
  console.log(x); // 10 (доступна вне блока)
}

let/const — блочная область видимости

function exampleLet() {
  if (true) {
    let y = 20;
    const z = 30;
  }
  console.log(y); // Ошибка: y is not defined
  console.log(z); // Ошибка: z is not defined
}

2. Поднятие

var — поднимается с инициализацией undefined

console.log(a); // undefined (не ошибка!)
var a = 5;
// Интерпретатор видит это так:
// var a;
// console.log(a);
// a = 5;

let/const — поднимаются, но не инициализируются

console.log(b); // Ошибка: Cannot access 'b' before initialization
let b = 10;

3. Переопределение и изменение

var — можно переопределять

var c = 1;
var c = 2; // Нет ошибки

let — нельзя переопределять, но можно изменять

let d = 1;
let d = 2; // Ошибка: Identifier 'd' has already been declared
d = 3; // OK

const — нельзя переопределять и изменять

const e = 1;
e = 2; // Ошибка: Assignment to constant variable

Но! Для объектов/массивов можно изменять свойства:

const obj = { name: 'Alice' };
obj.name = 'Bob'; // OK
obj = {}; // Ошибка

4. Глобальная видимость

var — добавляет свойство в window

var globalVar = 'I am global';
console.log(window.globalVar); // 'I am global'

let/const — не добавляют

let notGlobal = 'Local';
console.log(window.notGlobal); // undefined

5. Практика в Angular

  • Всегда используйте const по умолчанию.
  • let — только если переменная будет переопределяться.
  • var — никогда (устаревший подход).

Пример:

@Component({...})
export class MyComponent {
  ngOnInit() {
    const PI = 3.14; // Константа
    let counter = 0; // Будет изменяться
    for (let i = 0; i < 10; i++) { // Блочная область i
      // ...
    }
  }
}

Резюмируем

Критерий var let const
Область Функциональная Блочная Блочная
Поднятие undefined TDZ (ошибка) TDZ (ошибка)
Перезапись Разрешена Запрещена Запрещена
Изменение Да Да Нет (кроме объектов)
Глобальное Да (window) Нет Нет

Золотое правило:

  • const — по умолчанию.
  • let — если нужно изменить значение.
  • var — никогда не использовать в новых проектах.

P.S. В TypeScript эти правила особенно важны для корректной работы системы типов.