function exampleVar() {
if (true) {
var x = 10; // Видна во всей функции!
}
console.log(x); // 10 (доступна вне блока)
}
function exampleLet() {
if (true) {
let y = 20;
const z = 30;
}
console.log(y); // Ошибка: y is not defined
console.log(z); // Ошибка: z is not defined
}
console.log(a); // undefined (не ошибка!)
var a = 5;
// Интерпретатор видит это так:
// var a;
// console.log(a);
// a = 5;
console.log(b); // Ошибка: Cannot access 'b' before initialization
let b = 10;
var c = 1;
var c = 2; // Нет ошибки
let d = 1;
let d = 2; // Ошибка: Identifier 'd' has already been declared
d = 3; // OK
const e = 1;
e = 2; // Ошибка: Assignment to constant variable
Но! Для объектов/массивов можно изменять свойства:
const obj = { name: 'Alice' };
obj.name = 'Bob'; // OK
obj = {}; // Ошибка
var globalVar = 'I am global';
console.log(window.globalVar); // 'I am global'
let notGlobal = 'Local';
console.log(window.notGlobal); // undefined
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 эти правила особенно важны для корректной работы системы типов.