«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Понимание подъема в JavaScript: подробное руководство

Понимание подъема в JavaScript: подробное руководство

Опубликовано 5 ноября 2024 г.
Просматривать:857

Understanding Hoisting in JavaScript: A Comprehensive Guide

Подъем в JavaScript

Поднятие — это поведение, при котором объявления переменных и функций перемещаются (или «поднимаются») в начало их содержащей области действия (либо глобальной области видимости, либо области действия функции) перед код выполняется. Это означает, что вы можете использовать переменные и функции до того, как они будут фактически объявлены в коде.

Подъем переменных

вар

  • Переменные, объявленные с помощью var, поднимаются в начало области видимости, но их значения не инициализируются до тех пор, пока не произойдет присвоение.
console.log(x); // undefined
var x = 5;
console.log(x); // 5

пусть и константа

  • Переменные, объявленные с помощью let и const, также поднимаются, но помещаются во «временную мертвую зону» до тех пор, пока не будут достигнуты их объявления. Доступ к ним до их объявления приведет к ошибке ReferenceError.
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 10;

// block scope
{
  let x = 5;
}

console.log(x); // ReferenceError: x is not defined

Подъем в функциях

Традиционная функция

  • Объявления функций полностью поднимаются, то есть и объявление, и тело функции перемещаются в начало области видимости. Это позволяет вызывать функцию до ее объявления в коде.
sayHello(); // "Hello!"
function sayHello() {
  console.log("Hello!");
}
  • Напротив, функциональные выражения (где функция присваивается переменной) поднимаются только как переменные, поэтому их вызов до инициализации переменной приведет к undefine или TypeError.
greet(); // TypeError: greet is not a function
var greet = function () {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

Функция стрелки

  • Напротив, функциональные выражения (где функция присваивается переменной) поднимаются только как переменные, поэтому их вызов до инициализации переменной приведет к undefine или TypeError.
greet(); // TypeError: greet is not a function
var greet = () => {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

Временная мертвая зона (ВМЗ)

временная мертвая зона (TDZ) существует для переменных, объявленных с использованием let и const, поскольку JavaScript спроектирован таким образом, чтобы предотвратить доступ к этим переменным до их объявления и инициализации.

Почему var и let, const ведут себя по-разному при подъеме

  • Это связано с исторической эволюцией JavaScript.
  • Изначально JavaScript был разработан для пользователей, не являющихся разработчиками, и в основном JavaScript использовался для добавления небольших интерактивных элементов на веб-страницу.
  • Так что var поддерживает только функциональную область. Также в то время не было области действия блока.
  • Но в более позднем развитии JavaScript стало сложнее работать с var и исправлять ошибки.
  • Поэтому, чтобы сделать JavaScript конкурентоспособным по сравнению с другими современными языками, были добавлены дополнительные функции, такие как let, const, стрелочные функции, методы ES6 и т. д.

Почему var не обновляется, как let и const

  • Это из-за обратной совместимости.
  • В то время JavaScript широко использовался многими предприятиями, поэтому обновление или внесение изменений в существующие функции привело бы к нарушению кодовой базы.
  • Поэтому современные функции добавлялись индивидуально.

Общие вопросы на собеседовании

  • Что такое подъем в JavaScript?
  • Что поддерживается в JavaScript, а что нет?
  • В чем разница между var, let и const применительно к подъему?
  • Что такое временная мертвая зона (TDZ) в JavaScript?
  • Можете ли вы объяснить подъем с помощью объявлений функций и выражений функций?
  • Что такое подъем в модулях ES6?
  • Почему нам не следует полагаться на подъем в реальном коде?

Краткое содержание

  • Поднятие — это поведение по умолчанию в JavaScript, при котором объявления переменных и функций перемещаются в начало соответствующих областей на этапе компиляции.
  • Подъем работает только для переменных, объявленных с помощью var и традиционных функций, но не для функций let, const и стрелочных функций.
  • Поднимается только объявление функции, поэтому традиционные функции работают, но если функция назначена переменной, ее нельзя будет вызвать, пока она не будет определена.
  • Причина, по которой var и традиционные функции используются, а функции let, const и стрелки нет, заключается в том, что на начальном этапе JavaScript в основном использовался для небольших взаимодействий с пользовательским интерфейсом.
  • Но позже, поскольку JavaScript стал широко использоваться предприятиями для создания приложений, стало труднее исправлять ошибки только в глобальном масштабе.
  • Поэтому в будущих обновлениях будут устранены более серьезные проблемы с безопасностью.
  • Кроме того, обновление существующих функций привело бы к нарушению кодовой базы, поэтому новые функции добавлялись отдельно.
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/nishanthank/understanding-hoisting-in-javascript-a-comprehensive-guide-5bic?1. Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3