Простой подъем дает более высокую специфичность объявлениям javascript. Таким образом, он заставляет компьютер сначала читать и обрабатывать объявления, прежде чем анализировать другой код в программе.
Примечание. Хостинг не означает, что JavaScript переупорядочивает или перемещает код один над другим.
E.g.
console.log(name); // Uncaught ReferenceError: name is not defined let name = 'Deepa';
- переменные, объявленные с помощью let и const, поднимаются, но не инициализируются значением по умолчанию.
- Доступ к let или const до его объявления даст: Uncaught ReferenceError: невозможно получить доступ до инициализации
- Помните, что сообщение об ошибке говорит о том, что переменная где-то инициализирована.
Переменный подъем с var
Когда интерпретатор поднимает переменную, объявленную с помощью var, он инициализирует ее значение неопределенным, в отличие от let или const.
Например.
console.log(name); // undefined var name = 'deepa'; console.log(name); // deepa
Теперь давайте проанализируем это поведение:
var name; console.log(name); // undefined name = 'partha'; console.log(name); // partha
Помните, что первый console.log(name) выводит undefined, потому что имя поднято и получает значение по умолчанию (а не потому, что переменная никогда не объявлялась).
Использование неопределенной переменной вызовет ReferenceError
console.log(name); // Uncaught ReferenceError: name is not defined
Теперь давайте посмотрим, что произойдет, если мы не объявим var.
console.log(name); // partha
name = 'partha';
name = допустимо назначение необъявленной переменной.
JavaScript позволяет нам обращаться к переменным до того, как они будут объявлены. Такое поведение является необычной частью javascript и может привести к ошибкам.
Использование переменной до ее объявления нежелательно.
Причина, по которой мы получаем ошибку ссылки, когда пытаемся получить доступ к let или const до ее объявления, — это Temperal Dead Zone.
- TDZ начинается с начала переменных, охватывающих область видимости, и заканчивается, когда она объявлена.
- Доступ к переменной в TDZ дает ReferenceError
E.g.
// start of foo's TDZ let bar = 'bar'; console.log(bar); // bar console.log(foo); // ReferenceError: Because we're in TDZ let foo = 'foo'; // end of foo's TDZ
- тип TDZ для let или const: ReferenceError
- тип ТДЗ для var: undefined
Функциональный подъем
Объявления функций тоже поднимаются. Подъем функции позволяет нам вызывать функцию до того, как она будет объявлена или определена.
foo(); function foo() { console.log('foo'); // foo }
Примечание: поднимаются только объявления функций, а не выражения функций.
E.g.
foo(); // Uncaught TypeError: foo is not a function var foo = function() { } bar(); // Uncaught ReferenceError let bar = function() { }
Uncaught ReferenceError: невозможно получить доступ к «bar» до инициализации аналогично для const.
Для функции, которая никогда не объявлялась:
foo(); // Uncaught ReferenceError: foo is not defined