Как JavaScript променливият обхват е подобен на множество нива на управление

Случвало ли ви се е да разбиете клавиатурата си в неудовлетвореност, след като получавате неопределена стойност отново и отново, докато се опитвате да намерите стойността на променлива?

Или сте посочили две променливи едно и също нещо след часове и часове на кодиране, само за да откриете грешката си по-късно?

И двата проблема могат да бъдат свързани с обхвата на вашата променлива. Обхватът определя къде променливите ви ще бъдат достъпни в целия ви скрипт.

Когато правилно обхванете променливите си, ще откриете, че вашият код е по-лесен за четене и отстраняване на грешки за всеки зрител.

Проблемът

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

Сега JavaScript ви позволява да декларирате променливи с const и let. Те могат да добавят известна сложност, но те правят кода ви много по-лесен за разбиране.

За съжаление, повечето уроци описват тези прибори като кутии в кутии или еднопосочно стъкло. Не знам за вас, но не прекарвам много време в опаковане на кутии в кутии или гледане през слоеве от еднопосочно стъкло!

Мисля, че имам по-добър начин. Обхватът може да се обясни, като се разгледат начините, по които международните закони, националните и местните закони работят заедно. Така че, трябва само да разберете, че съществуват различни нива на управление, за да научите за различните нива на обхват. Ето бърз преглед и тогава ще влезем в него!

Законите за пиене са досадни, но да се надяваме, че не са твърде противоречиви

Ще се опитам да избегна всички закони, свързани с текущи политически въпроси.

Глобален обхват (ООН)

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

Те са подобни на международните закони. Имайте предвид, че е доста трудно да се приемат закони, с които всички 193 членове на ООН ще се съгласят. Така че тези закони трябва да обхващат само най-основните права на човека. Организацията на обединените нации не се включва в политиката за наркотици или религиозните закони, които биха могли да засягат отделни държави. Два примера могат да бъдат:

„Робството е забранено.“

„Химическите оръжия са забранени.“

Това означава, че тези закони ще бъдат валидни за всяка страна, която е част от Организацията на обединените нации, както и за всяка държава или провинция в тези страни.

Ето и версията на тези закони преди ES6.

В ES6 вече можем да декларираме променливи с const и let. Const ще направи стойността на променливата неизменна - тя няма да може да бъде променена. Нека не ще. Мисля, че тези две основни права на човека определено трябва да бъдат непроменими! Така че трябва да бъде:

Не искате да създавате твърде много глобални променливи. „Замърсяването“ на глобалния обхват означава, че дефинирате твърде много променливи, които са достъпни в глобален мащаб. От гледна точка на програмирането, затруднявате отстраняването на грешки и поддържането на кода, когато използвате глобални променливи.

В тази аналогия няма международни закони за възрастта, на която хората могат да пият алкохол. Всяка отделна държава трябва да определи тези правила. ООН никога няма да може да съществува, ако се опита да регулира възрастта за пиене!

Функция обхват (Съединени щати)

Тъй като законите по-горе са глобално определени, те са достъпни навсякъде в нашия скрипт. И тъй като те са определени с const, те са непроменими.

И какво да кажем за законите, които се прилагат само в Съединените щати? Един пример е възрастта за пиене, врагът на студентите навсякъде. Трябва да сте на 21 години, за да купувате алкохол в САЩ.

Трябва ли тази възраст да бъде неизменна или непроменима? Не. Всъщност нямаше универсален закон за възрастта за пиене в САЩ до 1984 г. Той може да се промени отново в бъдеще.

Ще използваме нека да определим този.

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

Само не забравяйте - законите на ООН все още са валидни в САЩ.

В този случай скобите са като границите на страната. Законите са валидни само в границите на тази страна. Така че, ако искате да създадете мексико функция, бихте могли да определите пиенето отново като 18.

Ето го този код във формата на диаграма.

Блок на обхвата (Масачузетс)

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

Блокът на обхвата означава, че променлива може да бъде локална за набор от скоби {}, като оператор if или за цикъл. Подобно на обхвата на функцията, променливата е валидна само в тези скоби.

В Масачузетс всички барове трябва да спрат да служат в 2 часа сутринта. Знам, знам - ако живеете в Европа, това вероятно звучи възмутително. Този закон всъщност варира според държавата. В Ню Йорк те могат да сервират до 4 часа сутринта.

Както и да е, за да превърнем тази работа в код, трябва да определим дали оператори в рамките на unitedStates функционират. Отново ще дефинираме променливата с let, защото тези закони със сигурност могат да се променят.

ChangeTime променливата е валидна само в блока if, докато drinkAge е валидна навсякъде във функцията unitedStates.

Ако искаме да определим отделно време за затваряне за Ню Йорк, можем да го направим и поради блокиране на обхвата.

Ако искате да предприемете действие въз основа на променливата closedTime, сега можете да направите нещо в рамките на всеки блок.

Ето една диаграма, която обхваща всичко това.

Промяна на променлива (приемане на нов закон)

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

Ще трябва да създадете функцията passDrinkingLaw в рамките на функцията unitedStates, тъй като е от значение само за САЩ. Няма глобални закони за пиене.

Той ще трябва също така да получи достъп до променливата drinkAge, която определи първоначалната възраст. Представете си, че сте искали да промените възрастта за пиене на 18. Ето как бихте направили това.

Ето защо е важно да се определи променливата в целия обхват на unitedStates. Бихте искали промените да влязат в сила за всяка бъдеща употреба на drinkAge. И ако искате да създадете универсална функция passDrinkingLaw, тя няма да работи с тази структура.

drinkAge е локален за функцията unitedStates. Ето версия на диаграмата.

Призив за действие

Хареса ли ви това? Дайте му пляскане, за да могат и другите да го открият. И ако искате да получавате известия, когато пускам бъдещи уроци, които използват аналогии, регистрирайте се тук: