JavaScript — это язык, поведение которого часто может сбить с толку новичков. Одним из таких вариантов поведения является поднятие, концепция, которую должен понимать каждый разработчик JavaScript, чтобы писать более предсказуемый код. В этой статье мы рассмотрим, что такое подъем, как он работает с переменными и функциями и как можно избежать связанных с ним ловушек.
Поднятие относится к поведению JavaScript по умолчанию, заключающемуся в перемещении объявлений (но не инициализаций) в начало их области видимости. Это происходит на этапе компиляции перед выполнением кода. Это означает, что вы можете использовать переменные и функции до того, как они будут фактически объявлены в вашем коде.
console.log(myVar); // undefined var myVar = 5;
В этом примере вы можете ожидать ошибку ReferenceError, поскольку myVar используется до ее объявления. Однако из-за подъема на самом деле происходит то, что объявление var myVar перемещается в верхнюю часть области видимости, а назначение (myVar = 5) остается на месте. Внутренне JavaScript интерпретирует это как:
var myVar; console.log(myVar); // undefined myVar = 5;
Из-за этого myVar определен, но еще не назначен при запуске console.log, поэтому он выводит неопределенное значение.
Давайте разберем, как работает подъем с различными типами переменных: var, let и const.
При использовании var поднимаются и объявление, и переменная. Однако перемещается только объявление, а не присвоение.
console.log(a); // undefined var a = 10;
Объявление var a поднимается, но присвоение происходит позже, поэтому при регистрации a не определена.
Переменные, объявленные с помощью let и const, также поднимаются, но они не инициализируются как неопределенные, как var. Вместо этого они входят в Временную мертвую зону (TDZ) от начала своей области действия до тех пор, пока не встретится объявление.
console.log(b); // ReferenceError: Cannot access 'b' before initialization let b = 20;
Здесь b поднимается, но он недоступен до тех пор, пока не будет выполнена фактическая строка объявления, что приводит к ошибке ReferenceError.
То же самое поведение применимо и к const, с дополнительным правилом, согласно которому константные переменные должны быть инициализированы во время объявления.
Объявления функций полностью поднимаются, то есть имя и тело функции перемещаются в начало области видимости. Это позволяет вам вызывать функции до их объявления.
greet(); // "Hello, World!" function greet() { console.log("Hello, World!"); }
Здесь объявление функции Greeting полностью поднято, поэтому функцию можно вызвать даже до того, как код достигнет своего определения.
Однако функциональные выражения не поднимаются таким же образом. Поскольку они рассматриваются как присваивания, поднимается только объявление переменной, а не определение функции.
greet(); // TypeError: greet is not a function var greet = function() { console.log("Hello, World!"); };
В этом случае переменная Greet поднимается, но в процессе поднятия ей присваивается неопределенное значение. Вот почему вызов Greeting() перед назначением выдает ошибку TypeError.
Чтобы избежать путаницы, вызванной подъемом, следуйте этим рекомендациям:
Объявляйте переменные в начале их области действия — хотя при подъеме объявления перемещаются наверх, рекомендуется объявлять их в начале соответствующих областей видимости. Это делает ваш код более читабельным и предсказуемым.
Используйте let и const вместо var — переменные, объявленные с помощью let и const, имеют блочную область видимости, что делает поведение подъема более понятным и менее подверженным ошибкам. Это также снижает вероятность случайного обращения к переменным до их инициализации.
Организуйте объявления функций — объявляйте свои функции перед их использованием, чтобы не полагаться на подъемное поведение.
Подъем — одна из многих особенностей JavaScript, но понимание того, как он работает, поможет вам писать более чистый и менее подверженный ошибкам код. Помните, что хотя объявления функций и переменные подняты, они ведут себя по-разному. Придерживайтесь let и const, а не var, и держите свой код хорошо организованным, чтобы избежать сюрпризов.
Помня о подъеме, вы можете сделать свой код JavaScript более предсказуемым и простым в обслуживании.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3