Читаоци попут вас помажу у подршци МУО. Када обавите куповину користећи везе на нашем сајту, можда ћемо зарадити провизију за партнере.
Подизање је ЈаваСцрипт механизам који вам омогућава да приступите променљивим и функцијама пре него што их иницијализујете. Подизање такве декларације ефективно је помера на врх њеног делокруга.
Сазнајте све о томе како подизање функционише у ЈаваСцрипт-у и како да њиме најбоље управљате да бисте избегли грешке у коду.
Променљиве за подизање са вар, лет и цонст
Подизање је могуће јер ЈаваСцрипт користи ЈИТ (Јуст-ин-Тиме) систем компилације, који скенира ваш код да би идентификовао све варијабле у њиховим одговарајућим опсегима.
ЈИТ компајлер затим подиже све инстанце декларација променљивих на врх њиховог опсега након компилације. ЈаваСцрипт подиже само декларације променљивих, а не и њихове иницијализације.
Понашање променљивих, када се подигну, зависи од кључне речи којом их декларишете, пошто се свака кључна реч понаша другачије.
вар
Приступ неиницијализованој променљивој декларисаној са вар кључна реч ће се вратити недефинисан. На пример:
конзола.лог (фоо); // недефинисан
вар фоо = 2;
Горе наведени кодови недефинисан јер зове цонсоле.лог пре него што иницијализује променљиву.
ЈаваСцрипт компајлер прегледа претходни блок кода овако:
вар фоо;
конзола.лог (фоо); // недефинисан
фоо = 2;
Током подизања, варијабле се придржавају правила ЈаваСцрипт опсега. Јавасцрипт ће само подићи променљиву на врх опсега у којем сте је декларисали. Покушај евидентирања вредности променљиве ван њеног декларисаног опсега резултираће а РеференцеЕррор. На пример, ако декларишете променљиву унутар функције, она неће бити видљива изван тог опсега:
функцијамиФунцтион() {
конзола.лог (фоо); // недефинисан
вар фоо = 10;
}
миФунцтион();
конзола.лог (фоо); // РеференцеЕррор: фоо није дефинисан
Покушај приступа променљивој ван њеног делокруга ће резултирати а РеференцеЕррор.
нека и конст
Према МДН документацију о дозволити и конст подизање, ЈаваСцрипт такође подиже варијабле декларисане са дозволити и конст кључне речи. Међутим, за разлику од променљивих декларисаних са вар кључне речи, нису иницијализоване са а недефинисан вредност.
На пример:
функцијамиФунцтион() {
конзола.лог (фоо); // недефинисан
конзола.лог (бар); // РеференцеЕррор: Није могуће приступити 'траци' пре иницијализације
конзола.лог (баз); // РеференцеЕррор: Није могуће приступити 'баз' пре иницијализацијевар фоо = 5;
дозволити бар = 10;
конст баз = 15;
}
миФунцтион();
Не можете приступити променљивим декларисаним помоћу кључних речи лет и цонст пре него што их иницијализујете вредношћу.
Функције подизања
ЈаваСцрипт дизалице функционише слично као и променљиве. Као и код променљивих, зависи од тога како их декларишете. На пример, ЈаваСцрипт подиже декларације функција другачије од израза функције.
Декларација функције је функција декларисана са именом, док је израз функције функција чије име можете изоставити. На пример:
функцијафоо() {
// декларација функције
}
конст бар = () => {
// израз функције
}
ЈаваСцрипт подиже декларације функција, али не и изразе функције. На пример:
фоо(); // 5
бар(); // ТипеЕррор: бар() није функција// Декларација функције
функцијафоо() {
конзола.Пријава(5);
}
// Израз функције
вар бар = функцијаизраз() {
конзола.Пријава(10);
};
Овај код позива фоо пре него што га декларише и иницијализује као функцију, али се и даље евидентира 5 на конзолу. Међутим, покушава да позове бар резултира у а ТипеЕррор.
Управљање подизањем
Бити свестан подизања и потенцијалних грешака до којих би могло доћи ако се њима погрешно управља може вам уштедети дуге сате отклањања грешака. Ево неколико начина на које можете управљати подизањем.
Декларишите варијабле унутар функција
Декларирајте променљиве унутар функција које ће им приступити. Нећете увек моћи то да урадите, јер ће вам можда требати глобална променљива којој можете приступити у оквиру више функција. Зато се уверите да променљиве декларишете глобално само ако вам је заиста потребно.
Декларишите променљиве са лет или цонст
Увек треба да користите лет и цонст кључне речи уместо вар кључну реч приликом декларисања променљивих. Ова пракса је корисна када се декларишу локалне променљиве унутар функције. Познавајући праве начине да декларисати променљиве у ЈаваСцрипт-у смањује шансе да се у вашем коду појаве грешке узроковане подизањем.
Декларишите варијабле на врху њиховог опсега
Декларисајте све своје променљиве на врху њихових одговарајућих опсега, пре било којих других изјава. На тај начин ће се обезбедити да ЈаваСцрипт компајлер не мора да подиже те варијабле да би им приступио.
Коришћење строгог режима
Строги режим је ЈаваСцрипт режим који регулише лошу синтаксу, оптимизује време извршавања вашег кода и забрањује злоупотребу лабаво откуцане синтаксе ЈаваСцрипт-а бацањем грешака у време компајлирања.
На пример, у „траљавом режиму“, због подизања, можете да приступите променљивој изван иницијализоване функције, иако није декларисана:
миФунцтион();
конзола.лог (фоо); // 20
функцијамиФунцтион() {
фоо = 20;
}
У блоку кода изнад, ЈаваСцрипт се аутоматски објављује фоо и подиже га на врх глобалног опсега, игноришући опсег у коме сте га иницијализовали.
Можете користити строги режим да поправите ово понашање и избаците грешку ако покушате да приступите променљивој изван њеног делокруга функције.
Строги режим не зауставља подизање у потпуности. Уместо тога, спречава најзбуњујуће и најсклоније облике дизања. Још увек је важно разумети општи концепт и правила која стоје иза подизања, чак и када користите заштитну мрежу строгог режима.
Да бисте омогућили строги режим на глобалном нивоу, наведите синтаксу на врху датотеке скрипте:
"користитистроги"; // или 'користитистроги'
Да бисте омогућили строги режим на нивоу функције, декларишете синтаксу на врху тела функције пре било којих изјава:
функцијамиСтрицтФунцтион() {
"користитистроги";
}
Ако декларишете строги режим на нивоу функције, поставка ће се применити само на изјаве унутар те функције.
Декларисање строгог режима на глобалном нивоу спречава приступ варијаблама изван њиховог опсега:
"користитистроги";
миФунцтион();
конзола.лог (фоо); // РеференцеЕррор: фоо није дефинисан
функцијамиФунцтион() {
фоо = 20;
}
Са укљученим строгим режимом, ЈаваСцрипт компајлер ће се подићи мојаФункција() на врх свог делокруга без недекларисане променљиве.
Разумети шта утиче на подизање
Подизање је прилично јединствено за ЈаваСцрипт и може бити врло збуњујуће понашање око које се можете замотати. То може утицати на променљиве и функције, али постоје начини да се то спречи ако је потребно.
Неколико фактора може утицати на подизање, тако да је најбоље да избегнете било какву појаву променљивих или функција подизања у вашем коду.