var, let и const (VLC) — доступные нам ключевые слова, с помощью которых мы можем объявлять переменные в JavaScript.
Синтаксис:
var a = 10; let b = 20; const c = 30;
Ход этой статьи
- Декларация
- Инициализация
- Передекларирование
- Повторная инициализация
- Объем
- Поднятый
- Представлено
- Лист изменений
1. Декларация:
Объявление переменных означает выделение памяти для переменных. Область действия этой переменной зависит от того, где она объявлена (функция/локальная или глобальная область).
Например, представьте, что переменная — это ведро с именем «а», которое вы купили в каком-то магазине «Х», и теперь оно пусто. Не присвоено никакого значения.
var a; // allowed let b; // allowed const c; // not allowed SyntaxError: Missing initializer in const declaration
Мы можем объявить var и let в одной строке и инициализировать позже. Но с const это не разрешено. С помощью const нам нужно объявить переменную и инициализировать ее значением в той же строке.
const c = 10 ; // allowed
2. Инициализация:
Инициализация означает присвоение значения объявленной переменной. Представьте, что вы кладете яблоко в ведро, которое мы купили всего несколько минут назад.
Инициализация той же строки:
var a = 10, let b = 20; const c = 30;
Поздняя инициализация:
Объявление переменной в одной строке и инициализация ее позже.
var a; a = 10; // allowed let b; b = 20; // allowed const c; c = 30; // not allowed SyntaxError: Missing initializer in const declaration
3. Повторная инициализация:
Придание некоторого значения одной и той же объявленной переменной. Он ссылается на ту же переменную в памяти. Предположим, вы кладете еще одно яблоко в то же место и в то же ведро.
Здесь мы объявили var a = 10 еще раз, а затем снова попытались его повторно инициализировать. См. комментарии ниже, чтобы понять пример.
var a = 10; //declared once a = 20; //reintialized again --> its possible with var let b = 10; //declared once b = 20; //reintialized again --> its possible with let const c = 10; //declared once c = 20; //reintialized again --> its NOT possible with let, TypeError: Assignment to constant variable.
4. Повторное объявление:
Снова объявление того же имени переменной.
Когда мы объявляем переменную с тем же именем, js не выделяет новую память, а просто обновляет предыдущую переменную новым значением.
Мы не можем объявить let и const дважды в одной и той же области видимости.
var a = 10; var a = 20; //its possible to with var let b = 10; let b = 20; //its not possible to with let SyntaxError: Identifier 'b' has already been declared const c = 10; const c = 20; //its not possible with const SyntaxError: Identifier 'c' has already been declared
Подумайте об этом:если константные переменныесоздают постоянную ссылку на значение, то как работает эта модификация сложных данных, если они объявлены с ключевым словом const.
const arr = [];
5. Область применения
а) Функциональный объем:
Чтобы понять функциональную область применения var, сначала рассмотрим пример переменной без ключевого слова.
Сначала давайте объявим переменную приветствия БЕЗ var .
When we don’t declare variables without any var, let and const , variables gets hoisted globally .
Чтобы доказать то, что я только что сказал, просто запустите приведенный ниже код, и вы увидите, что даже после удаления функции из стека у нас все еще будет ссылка на приветствие. В противном случае возникнет ошибка: приветствие не определено.
ПРИМЕЧАНИЕ:
function willFoofi() {
Greeting = «Привет, foofi!»; // поднимается глобально
console.log(greeting);
willFoofi();
console.log(greeting); // Привет, фуфи!
Output: Hello, foofi! Hello, foofi!
Давайте объявим переменную приветствия с помощью var
Попробуйте этот код, и вы увидите ошибку, потому что при вызове функции она выведет «Hello, foofi!» в консоли. Но после вызова, как мы все знаем, функция будет удалена из стека, и на этот раз приветствие было ограничено функциональной областью из-за объявления var, которое здесь не доступно нам глобально.
Итак, вы увидите «Привет, фуфи!» и ошибку о том, что приветствие не определено.
function wishFoofi() { var greeting = "Hello, foofi!"; //greeting remained functional scoped console.log(greeting); } wishFoofi(); console.log(greeting); // error Output: Hello, foofi! ReferenceError: greeting is not defined
На этом примере мы можем понять, что var имеет функциональную область действия.
б) Область действия блока
Anything inside these curly braces {} is block scoped.
var: он не соответствует области блока, поскольку мы знаем, что он имеет область действия функции, глобальную область видимости (если объявлен вне какой-либо функции). В примере ниже мы видим x доступен за пределами области действия блока, следовательно, он не ограничен областью действия блока.
let:Это блочная область действия. В приведенном ниже примере мы видим, что y недоступен за пределами области действия блока.
const :Это также блочная область действия. В приведенном ниже примере мы видим, что z недоступен за пределами области действия блока.
{ var x = 10; } console.log(x); // output 10 { let y = 20; } console.log(y); // output : ReferenceError: y is not defined { const z = 30; } console.log(z); // output : ReferenceError: z is not defined
6. Поднятый
var :во время компиляции переменные с var поднимаются вверху области видимости функции или глобально ( если объявлено вне функции) и становится неопределенным.
console.log(x); // Outputs 'undefined' var x = 10; // Assignment remains in its original position
Здесь, в этом примере, x поднимается глобально, и мы получаем неопределенное значение.
let и const :переменные с let и const также поднимаются, но находятся в верхней части области действия блока, и им не присваивается неопределенное значение.
console.log(y); // TDZ: ReferenceError:Cannot access 'y' before initialization . // TDZ: ReferenceError:Cannot access 'y' before initialization . // TDZ: ReferenceError:Cannot access 'y' before initialization . // TDZ: ReferenceError:Cannot access 'y' before initialization . // TDZ: ReferenceError:Cannot access 'y' before initialization let y = 10; // now initialized so TDZ finished console.log(y); // 10
В приведенном выше примере y поднимается вверху блока, но попадает во «временную мертвую зону» (TDZ). Поэтому мы не можем получить доступ к этой переменной, пока не будет достигнут оператор объявления. Во время TDZ попытка доступа к переменной приводит к ошибке ReferenceError
.
7. Представлено:
var : С var и без ключевого слова ( x = 10 ) были единственными способами объявления переменных до введения let и const в ECMAScript 6 (ES6), известных как ECMAScript 2015.
Ответ в разделе «Подумай об этом»: изменение ссылки на константную переменную не разрешено, но это ограничение не распространяется на контент. Так что мы можем это изменить.
а) Изменение содержимого массива
Пример
const catsAge = [ 4 , 9 , 10, 8 ]; catsAge[ 4 ] = 13; // this will work perfectly
б) Изменение ссылки на массив
Но если вы попытаетесь присвоить этот массив какому-то другому новому массиву, это приведет к ошибке.
Пример
const catsAge = [ 4 , 9 , 8 ]; catsAge = [ 2 , 3 , 5 ]; // TypeError: Assignment to constant variable.
Пересмотренный лист: быстрый пересмотр важных моментов этой статьи.
Если у вас есть какие-либо мысли или конструктивные отзывы по поводу этой статьи, пожалуйста, оставьте комментарий или отправьте мне сообщение в любое время.
Linkedin — https://lnkd.in/d8NZhUZu