Читатели като вас помагат в подкрепа на MUO. Когато правите покупка чрез връзки на нашия сайт, ние може да спечелим комисионна за партньор.

Повдигането е механизъм на JavaScript, който ви позволява достъп до променливи и функции, преди да ги инициализирате. Повдигането на такава декларация ефективно я премества на върха на нейния обхват.

Научете всичко за това как повдигането работи в JavaScript и как да го управлявате най-добре, за да избегнете грешки в кода си.

Повдигане на променливи С var, let и const

Повдигането е възможно, защото JavaScript използва системата за компилиране JIT (Just-in-Time), която сканира вашия код, за да идентифицира всички променливи в съответните им обхвати.

След това JIT компилаторът издига всички екземпляри на декларации на променливи в горната част на техния обхват при компилиране. JavaScript само повдига декларации на променливи, не и техните инициализации.

Поведението на променливите, когато бъдат повдигнати, зависи от ключовата дума, с която ги декларирате, тъй като всяка ключова дума се държи различно.

instagram viewer

вар

Достъп до неинициализирана променлива, декларирана с вар ключова дума ще се върне недефиниран. Например:

конзола.log (foo); // недефиниран
вар фу = 2;

Горният код се регистрира недефиниран защото се обажда console.log преди да инициализира променливата.

Компилаторът на JavaScript разглежда предишния кодов блок така:

вар foo;
конзола.log (foo); // недефиниран
foo = 2;

По време на повдигане променливите се подчиняват на правила за обхват на JavaScript. Javascript само ще издигне променлива в горната част на обхвата, в който сте я декларирали. Опитът да се регистрира стойността на променлива извън нейния деклариран обхват ще доведе до a ReferenceError. Например, ако декларирате променлива във функция, тя няма да бъде видима извън този обхват:

функцияmyFunction() {
конзола.log (foo); // недефиниран
вар фу = 10;
}

myFunction();
конзола.log (foo); // ReferenceError: foo не е дефинирано

Опитът за достъп до променлива извън нейния обхват ще доведе до a ReferenceError.

нека и const

Според MDN документация по позволявам и конст повдигане, JavaScript също повдига променливи, декларирани с позволявам и конст ключови думи. Въпреки това, за разлика от променливите, декларирани с вар ключова дума, те не се инициализират с an недефиниран стойност.

Например:

функцияmyFunction() {
конзола.log (foo); // недефиниран
конзола.log (лента); // ReferenceError: Няма достъп до „лента“ преди инициализация
конзола.log (baz); // ReferenceError: Няма достъп до 'baz' преди инициализация

вар фу = 5;
позволявам бар = 10;
конст база = 15;
}

myFunction();

Не можете да получите достъп до променливи, декларирани с ключовите думи let и const, преди да ги инициализирате със стойност.

Подемни функции

JavaScript повдига функции подобно на променливите. Както при променливите, зависи от това как ги декларирате. Например JavaScript повдига декларации на функции по различен начин от изрази на функции.

Декларацията на функция е функция, декларирана с име, докато изразът на функция е функция, чието име можете да пропуснете. Например:

функцияФу() {
// декларация на функция
}

конст лента = () => {
// израз на функция
}

JavaScript повдига декларации на функции, но не и изрази на функции. Например:

foo(); // 5
бар(); // TypeError: bar() не е функция

// Декларация на функция
функцияФу() {
конзола.log(5);
}

// Функционален израз
вар бар = функцияизразяване() {
конзола.log(10);
};

Този код се обажда Фу преди да го декларира и инициализира като функция, но все още се регистрира 5 към конзолата. Въпреки това се опитва да се обади бар води до a TypeError.

Управление на повдигане

Осъзнаването на повдигането и потенциалните грешки, които могат да възникнат при неправилно управление, може да ви спести дълги часове отстраняване на грешки. Ето няколко начина, по които можете да управлявате повдигането.

Декларирайте променливи вътре във функциите

Декларирайте променливи във функциите, които ще имат достъп до тях. Невинаги ще можете да направите това, тъй като може да се нуждаете от глобална променлива, до която имате достъп в множество функции. Така че се уверете, че декларирате променливи глобално само ако наистина имате нужда.

Декларирайте променливи с let или const

Винаги трябва да използвате let и const ключови думи на мястото на вар ключова дума при деклариране на променливи. Тази практика е полезна при деклариране на локални променливи във функция. Познаването на правилните начини за декларирайте променливи в JavaScript намалява шансовете за грешки, причинени от повдигане във вашия код.

Декларирайте променливи в горната част на техния обхват

Декларирайте всичките си променливи в горната част на съответните им обхвати, преди всякакви други изрази. Това ще гарантира, че компилаторът на JavaScript не трябва да повдига тези променливи, за да има достъп до тях.

Използване на строг режим

Строгият режим е режим на JavaScript който регулира лошия синтаксис, оптимизира времето за изпълнение на вашия код и забранява злоупотребата със свободно въведения синтаксис на JavaScript чрез хвърляне на грешки по време на компилиране.

Например, в „небрежен режим“, поради повдигане, можете да получите достъп до променлива извън инициализираната функция, въпреки че не е декларирана:

myFunction();
конзола.log (foo); // 20

функцияmyFunction() {
foo = 20;
}

В кодовия блок по-горе JavaScript автоматично декларира Фу и го издига до върха на глобалния обхват, игнорирайки обхвата, в който сте го инициализирали.

Можете да използвате строг режим, за да коригирате това поведение и да изведете грешка, ако се опитате да получите достъп до променливата извън нейния функционален обхват.

Строгият режим не спира повдигането напълно. Вместо това, той предотвратява най-объркващите и податливи на грешки форми на повдигане. Все още е важно да разберете общата концепция и правилата зад повдигането, дори когато използвате предпазната мрежа в строг режим.

За да изберете строг режим на глобално ниво, декларирайте синтаксиса в горната част на вашия скриптов файл:

"използванестрог"; // или 'използванестрог'

За да изберете строг режим на функционално ниво, декларирайте синтаксиса в горната част на тялото на функция преди всякакви изрази:

функцияmyStrictFunction() {
"използванестрог";
}

Ако декларирате строг режим на функционално ниво, настройката ще се прилага само за изрази вътре в тази функция.

Декларирането на строг режим на глобално ниво предотвратява достъпа до променливи извън съответните им обхвати:

"използванестрог";
myFunction();
конзола.log (foo); // ReferenceError: foo не е дефинирано

функцияmyFunction() {
foo = 20;
}

При включен строг режим компилаторът на JavaScript ще се повдигне myFunction() в горната част на своя обхват без недекларираната променлива.

Разберете какво влияе върху повдигането

Повдигането е доста уникално за JavaScript и може да бъде много объркващо поведение, за да се замислите. Може да повлияе на променливи и функции, но има начини да го предотвратите, ако е необходимо.

Няколко фактора могат да повлияят на повдигането, така че е най-добре да избягвате всяка поява на променлива или функция на повдигане във вашия код.