Переменные — это именованные области памяти. Когда мы объявляем переменную в JavaScript, это означает, что место в памяти выделяется для хранения некоторого значения, и к этому месту можно получить доступ, используя имя переменной.
Вот пример объявления переменной.
var name;
Здесь name
указывает на некоторую область памяти в ОЗУ. Один из способов сохранить некоторое значение в этой ячейке памяти — использовать оператор присваивания (=
).
name = "Backbencher";
Объявление переменной
В JavaScript переменная может быть объявлена с использованием любого из следующих ключевых слов.
var
let
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"