Переменные — это именованные области памяти. Когда мы объявляем переменную в JavaScript, это означает, что место в памяти выделяется для хранения некоторого значения, и к этому месту можно получить доступ, используя имя переменной.

Вот пример объявления переменной.

var name;

Здесь name указывает на некоторую область памяти в ОЗУ. Один из способов сохранить некоторое значение в этой ячейке памяти — использовать оператор присваивания (=).

name = "Backbencher";

Объявление переменной

В JavaScript переменная может быть объявлена ​​с использованием любого из следующих ключевых слов.

  1. var
  2. let
  3. const

вар

var можно объявлять либо глобальные переменные, либо функциональные переменные.

var a;
function baz() {
  var b;
}

Переменная a объявлена ​​вне всех функций. Следовательно, a находится в глобальной области видимости. Переменная b объявлена ​​внутри функции baz(). Следовательно, b находится в области действия функции, т. е. в области действия baz(). Переменная b может использоваться только внутри функции baz().

Значение по умолчанию

Значение по умолчанию переменной, объявленной с использованием var, равно undefined.

var a;
console.log(a); // undefined

Повторное объявление переменной

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

var a = 3;
var a = 5;
console.log(a); // 5

Движок JavaScript отслеживает все объявленные переменные. Таким образом, в строке 2 вместо повторного объявления a движок сопоставляется с ячейкой памяти, созданной в строке 1. В таком случае, каков результат приведенного ниже кода?

var a = 3;
var a;
console.log(a);

Если вы ожидали undefined, это неправильно. Выход 3. Здесь также в строке 2 происходит повторное объявление переменной a. Движок JavaScript пропускает это. Поскольку в строке 2 нет присваивания, предыдущее значение (3) сохраняется.

Подъем

Переменные, объявленные с использованием var, создаются перед выполнением любого кода. Прежде чем интерпретировать код JavaScript построчно, движок JavaScript анализирует весь код. На этом этапе синтаксического анализа движок выделяет память для переменных, объявленных с помощью var, и назначает undefined. Такое поведение называется поднятием переменных.

console.log(a); // undefined
var a;

Здесь строка 1 пытается напечатать значение a. Но переменная a объявлена ​​только в строке 2. Из-за подъема, когда движок JavaScript выполняет строку 1, переменная a уже создана. Вот почему приведенный выше код выводит undefined.

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

console.log(a);
var a;
console.log(b);
var b;
console.log(c);
var c;

После этапа синтаксического анализа код для движка JavaScript выглядит так, как показано ниже.

var a;
var b;
var c;
console.log(a);
console.log(b);
console.log(c);

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

В процессе подъема выполняется только выделение памяти. Присвоение значений ячейке памяти происходит только во время выполнения. В этом контексте, каков будет вывод следующего кода?

console.log(a); // undefined
var a = 6;

Код выше выводит undefined в качестве вывода. Это связано с тем, что значение 6 присваивается переменной только тогда, когда движок JavaScript достигает строки 2. До этого времени значение a равно undefined.

Переменная как свойство глобального объекта

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

var myVar = 4;
console.log(window.myVar); // 4

Здесь свойство myVar элемента window не может быть удалено с помощью оператора delete.

var myVar = 4;
delete window.myVar;
console.log(window.myVar); // 4

позволять

Переменная, объявленная с использованием ключевого слова let, имеет блочную область действия. Блок — это часть кода, заключенная в фигурные скобки ({}).

{
  let a;
}
console.log(a); // ReferenceError: a is not defined

Глобальная переменная let

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

let letVariable = "let it Backbencher";
var varVariable = "var it Backbencher";
console.log(window.letVariable);  // undefined
console.log(window.varVariable);  // "var it Backbencher"

позволить переобъявлению переменной

Когда переменная повторно объявляется с использованием let, она выдает SyntaxError.

let a;
let a; // SyntaxError: Identifier 'a' has already been declared

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

var a;
let a; // SyntaxError: Identifier 'a' has already been declared

Временная мертвая зона

Переменная, объявленная с использованием let, не может быть доступна до ее объявления. Переменная считается находящейся в временной мертвой зоне. Рассмотрим следующий код.

console.log(a);
console.log(b);
var a;
let b;

Перед выполнением кода построчно выполняется этап синтаксического анализа. Во время синтаксического анализа все объявления понимаются, и определяется выделение памяти и область действия. Когда память выделяется для a, ей автоматически присваивается значение undefined. Но для b память выделяется, но не присваивается значение.

После синтаксического анализа выполнение начинается построчно. Поэтому, когда выполнение достигает строки 2, память для b есть, но находится в нечитаемом состоянии (временная мертвая зона). В строке 4 движок присваивает undefined b после просмотра оператора объявления. Операторы, если они есть после строки 4, могут получить доступ к переменной b.

константа

const используется для объявления переменных, значения которых нельзя переназначить. По сути, const создает постоянные переменные.

const a = 5;
a = 4; // TypeError: Assignment to constant variable

Объявлено и присвоено

Постоянная переменная должна быть назначена одновременно с объявлением. Если мы попытаемся разделить операцию объявления и присваивания, это выдаст ошибку.

const a; // SyntaxError: Missing initializer in const declaration
a = 5;

Область действия блока

Переменная, объявленная с использованием const, имеет область действия блока.

{
  const a = 5;
}
console.log(a); // ReferenceError: a is not defined

Повторное объявление переменной

Константная переменная не может быть повторно объявлена. Начальное объявление может быть через var, let или const.

var a;
const a = 5; // SyntaxError: Identifier 'a' has already been declared

Подъем

Переменная, объявленная с использованием const, не поднимается, как и let.

console.log(a); // ReferenceError: Cannot access 'a' before initialization
const a = 5;

Здесь обратите внимание на сообщение об ошибке в строке 1: «Не удается получить доступ к ‘a’ перед инициализацией». Это означает, что движок знает, что переменная будет объявлена ​​позже. Эта осведомленность достигается на этапе синтаксического анализа перед выполнением кода. В строке 1 говорится, что переменная a находится в временной мертвой зоне.

Постоянные объекты

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

const obj = {
  name: "Backbencher"
};
obj.name = "Updated";
console.log(obj.name); // "Updated"

var vs let vs const