Постоје додатне разлике између њих, осим синтаксе.

Као скоро сваки савремени програмски језик, ЈаваСцрипт нуди начине за креирање функција које омогућавају поновну употребу кода. За оне који нису упознати са језиком, постоје два различита начина да се декларише функција у ЈаваСцрипт-у.

Првобитно, тхе функција коришћена је кључна реч, а касније је креирана синтакса стрелице. Иако се разликују по доступности опсега, и кључна реч функције и синтакса стрелице дају сличне резултате.

Немогућност разликовања између то двоје може изазвати проблеме и довести до погрешне употребе. Неопходно је да савремени ЈС програмер разуме како свака декларација функције утиче на опсег и видљивост.

Шта су ЈаваСцрипт функције стрелице?

ЈаваСцрипт функције стрелице представљају алтернативни начин за дефинисање функција које не користе подразумеване функција кључна реч:

функцијалогМессаге(порука) {
конзола.лог (порука);
}

конст логМессаге = (порука) => {
конзола.лог (порука);
}

конст логМессаге = порука =>конзола.лог (порука);

instagram viewer

Изнад можете видети исту поруку написану на три различита начина. Први користи метод декларације регуларне функције. Следећа два показују два начина коришћења ЕС6 функција стрелице.

ЈаваСцрипт је први пут усвојио синтаксу функције стрелице са издавањем стандарда ЕЦМАСцрипт 2015. Функције стрелице су понудиле чист и концизан начин за брзо креирање функција и занимљиво решење за неколико дуготрајних проблема са опсегом у ЈаваСцрипт-у.

Ове карактеристике су брзо учиниле функције стрелица хит међу многим програмерима. Програмери који траже модерну ЈаваСцрипт базу кода подједнако ће вероватно пронаћи функције стрелице као и обичне функције.

Како се функције стрелице разликују од регуларних функција у ЈаваСцрипт-у?

На први поглед се чини да се функције стрелице не разликују много од функција декларисаних помоћу кључне речи функције. Изван синтаксе, оба инкапсулирају скуп акција за вишекратну употребу које се могу позвати са другог места у коду.

Међутим, упркос сличностима између њих, постоје неке разлике којих програмери морају да буду свесни.

Разлика у обиму

Кад год је регуларна функција декларисана у ЈаваСцрипт-у, то функција ради као затварање које ствара сопствени опсег. Ово може изазвати проблем када користите одређене специјализоване функције као што су сетТимеоут и сетИнтервал.

Пре ЕС6, постојао је значајан број заобилазних решења која би подигла ставке на виши ниво за коришћење у повратним позивима. Ови хакови су функционисали, али су често били тешки за разумевање и могли су да изазову проблеме са преписивањем одређених варијабли.

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

Ово је омогућило да се функције користе као повратни позиви без губитка приступа контексту у којем је првобитни догађај позван. Као једноставан тест да покажете овај принцип у акцији, можете подесити функцију одложене размјене порука попут оне испод:

функцијаделаиедМессаге(порука, одлагање) {

сетТимеоут(функција(порука) {
конзола.лог (порука);
}, кашњење);

}

делаиедМессаге("Здраво Свете", 1000);

Функција је једноставна, прихвата порука и кашњење у милисекундама. Након што кашњење прође, требало би да евидентира поруку на конзоли. Међутим, када се код изврши, недефинисан биће пријављен на конзоли уместо поруке која је прослеђена.

Када се изврши функција повратног позива, опсег се мења и оригинална порука више није доступна. Коришћење поруке унутар затварања захтева да порука буде подигнута на глобалну променљиву, што би могло да доведе до њеног преписивања пре повратног позива.

Функција стрелице је право решење за овај проблем. Ако замените први аргумент за сетТимеоут, опсег се може одржавати, а функција ће имати приступ поруци којој је прослеђена делаиедМессаге.

функцијаделаиедМессаге(порука, одлагање) {

сетТимеоут(() => {
конзола.лог (порука);
}, кашњење);

}

делаиедМессаге("Здраво Свете", 1000);

Сада, када је извршено, делаиедМессаге функција ће пријавити поруку. Поред тога, ово омогућава да се више порука стави у ред са различитим кашњењима, а све ће се и даље појавити у тачно време.

То је због чињенице да сваки пут делаиедМессаге се користи, генерише сопствени опсег са сопственом копијом интерне функције стрелице.

Читљивост кода

Док су функције са стрелицама корисне као повратни позиви, оне се такође користе да би код био чист и концизан. У горњем одељку можете видети да коришћење функције стрелице чини очигледним шта ће се догодити када се делаиедМессаге функција се зове.

Како функције постају сложеније, мало јасноће може учинити код далеко читљивијим. Приликом састављања објеката, ово може учинити код једноставнијим када додајете кратке функције:

класабројач{
_цоунт = 0;
прираст = () => {
ово._цоунт += 1;
}
декремент = () => {
ово._цоунт -= 1;
}
цоунт = () => {
повратаково._цоунт;
}
}

дозволити цт = Нова цоунтер();

Улога у објектно оријентисаном програмирању

Иако су ЈаваСцрипт функције стрелица саставни део функционалног програмирања, оне такође имају своје место објектно оријентисано програмирање. Функције стрелице се могу користити у декларацијама класе:

класаордерЛинеИтем{
_ЛинеИтемИД = 0;
_Производ = {};
_Кти = 1;

конструктор(производ) {
ово._ЛинеИтемИД = црипто.рандомУУИД();
ово._Производ = производ
}

цхангеЛинеИтемКуантити = (невКти) => {
ово._Кти = невКти;
}
}

Коришћење функције стрелице за декларисање метода унутар декларације класе не мења понашање функције унутар класе. Изван класе, међутим, открива функцију, омогућавајући да је користе друге класе.

Регуларним функцијама се не може приступити ван декларације класе без позивања. То значи да док друге декларације класа могу да наследе ове функције, њима се не може директно приступити за састављање других класа.

Када треба да користите ЈаваСцрипт функције стрелице?

ЈаваСцрипт-ове функције стрелица су невероватно моћна функција која програмерима даје далеко већу контролу над опсегом коме функција има приступ. Знање када повратни позив треба да има приступ свом родитељском опсегу, а када не, може помоћи програмеру да одреди коју врсту декларације да користи.

Функције стрелице дају програмерима јасан и концизан начин да напишу повратне позиве без откривања делова опсега који би требало да буду сакривени. Они такође омогућавају креирање чистих и једноставних композиција, додатно омогућавајући функционално програмирање у ЈаваСцрипт-у.

ЈС програмери морају бити свесни разлика између ове две синтаксе и имати на уму која је синтакса прикладна када декларишу своје функције.