Функције¶
Велики део програма се састоји од извршавања процедура, које се састоје од десетине наредби, а њихова извршавања се понављају велики број пута. Уместо да, сваки пут када је потребно извршити такве сложене операције, кодираш читаву логику испочетка, код који имплементира неку процедуру можеш издвојити у део који називамо функција. Предност функција у односу на копирање кода јесте што група наредби која чини неку функцију има свој назив, тако да извршавање логике своди се на једноставан позив функције путем њеног назива. Додатно, функције је много лакше одржавати него дуплирани код, а одабир исправног назива функције значајно олакшава и убрзава разумевање кода.
Дефинисање функција¶
На наредној слици је дат пример дефиниције функција у језику JavaScript. Све функције представљају вредности типа „function”. Функција, као што смо рекли, има свој назив који мора бити јединствен, а које се наводи након кључне речи function. Затим следи листа имена параметара функције у обичним заградама и, коначно, тело функције које представља блок наредби у витичастим заградама. Функције које враћају вредности позиваоцу би требало да у телу садрже и наредбу return којом се наводи повратна вредност. Функција приказана на слици израчунава већу од две вредности.

Функција се извршава (тј. позива) навођењем њеног назива, за којим следи листа аргумената у обичним заградама. Аргументи функције представљају вредности које ће заменити параметре функције у коду којим је функција дефинисана приликом њеног извршавања. Пример позива функције са претходне слике је дат у наставку.
let a = 2;
let b = 3;
let rezultat = veci_od(a, b);
console.log("Већ број је:", rezultat); // 3
Параметри функције, као и њена повратна вредност, могу бити произвољне JavaScript вредности. На пример, функција veci_od се може искористити и за израчунавање која од две ниске је у лексикографском поређењу испред друге ниске.
let x = "веб";
let y = "ВЕБ";
let rezultat = veci_od(x, y);
console.log("Ниска која је испред друге је:", rezultat); // "веб"

Задатак: Напиши JavaScript програм који израчунава и у конзоли исписује површину једнакостраничног троугла. За рачунање квадратног корена можеш искористити метод Math.sqrt. Ивицу троугла затражити од корисника.
Функције и низови¶
Функције представљају веома користан начин да код који обрађује низове изместиш у одвојену (и именовану) логичку целину како би се повећала читљивост кода. У случају обраде низова помоћу циклуса, можеш издвојити тело циклуса у функцију, као и цео циклус у функцију.
Задатак: Напиши JavaScript програм који од корисника захтева да унесе број N између 1 и 10. Затим, за сваки од пречника кругова од 1 cm до N cm програм израчунава и у конзоли исписује обиме тих кругова. За број π можеш искористити вредност Math.PI.
Оно што је важно да запамтиш јесте да, када прослеђујеш низове као аргументе функцијама, JavaScript неће направити копију низа, већ ће проследити оригинални низ. То значи да су низови подложни променама у оквиру функција. Ову чињеницу можеш да искористиш уколико је потребно да измениш оригиналне вредности низова.
Напомена: Ова чињеница је заједничка за све вредности типа „object”, што значи не само за низове, већ и за објекте.

Задатак: Напиши JavaScript програм који из низа који садржи ниске скраћује све ниске које су дуже од \(N\) карактера, тако да имају највише \(N\) карактера, где је \(N\) број који се захтева од корисника да унесе.
Води рачуна да некада ово понашање није пожељно, поготово уколико осталим програмерима није јасно да ће твој код изменити оригинални низ! У ту сврху, добро је да оставиш коментар који јасно наводи ову чињеницу, као што је то урађено у претходном задатку. Наредни задатак показује алтернативно решење, које враћа нови низ који испуњава жељена очекивања.

Задатак: Реши претходни задатак тако да функција skrati_niske не мења оригинални низ.
Функције и објекти¶
При раду са сложеним типовима података, као што су објекти, добро је да размишљаш како да поделиш логику програма у што мање целине. На пример, ако је потребно да обрадиш низ података, вероватно ћеш имати једну функцију за обраду самог низа, а затим другу функцију за обраду једног објекта-елемента низа.

Задатак: На такмичењу из програмирања учествују Јанко, Јована и Јелена. Такмичење се састоји од три задатка. Резултати такмичара су дати у наредној табели и представљају проценте квалитета решења за сваки задатак. Напиши JavaScript програм који од организатора такмичења захтева да, за сваки задатак, унесу број бодова који задатак носи. Затим, програм израчунава и у конзоли исписује име такмичара који има највише поена.
Име такмичара |
|||
---|---|---|---|
Број задатка |
Јанко |
Јована |
Јелена |
1 |
20 |
70 |
80 |
2 |
40 |
30 |
100 |
3 |
80 |
20 |
50 |
Функције као методи¶
Уколико је нека функција блиско повезана са подацима неког објекта, онда је корисно имплементирати ту функцију као метод тог објекта. Методи објекта се наводе нешто другачије у односу на друга својства. Наредна слика илуструје објекат који представља троугао и који садржи метод obim, који се може искористити за израчунавање обима тог троугла. Примети да се у дефиницији метода појављује нова кључна реч – this. Ову кључну реч можеш да користиш ради дохватања других својства у објекту, као што је у овом примеру случај са дохватањем дужина страница троугла.


Задатак: Иван жели да прочита лектире за летњи распуст како би се боље припремио за часове српског језика и књижевности. Књиге које треба да прочита (са бројем страна у заградама) јесу: ”Мајстор и Маргарита” (372), ”Чекајући Годоа” (150) и ”Злочин и казна” (576). Напиши JavaScript програм који захтева од Ивана да унесе просечан број страница које планира да прочита дневно, па за сваки роман исписује у конзоли колико најмање дана ће му бити потребно да прочита сваку књигу.
Функције као вредности¶
С обзиром да су и функције JavaScript вредности, једна интересантна особина јесте да се једна функција може проследити другој функцији као аргумент. Наредни задатак показује како се ова особина може искористити за писање веома апстрактних процедура које се могу користити у различите сврхе (као што је функција obradi_recenicu_rec_po_rec).

Задатак: Напиши JavaScript програм који од корисника захтева да унесе реченицу, а затим прави нову реченицу тако што у свакој речи у реченици мења прво слово на велико. Омогући да се исти код за обраду реченице може искористити и за прављење реченице која свако прво и последње слово у свакој речи мења у велико.
Примети да је функција obradi_recenicu_rec_po_rec имплементирана тако да се исти код може применити за најразличитије задатке обраде текста. Писање апстрактног кода је напредна техника коју програмери стичу радом на пројектима и дискутовањем са својим колегама у тиму приликом развоја апликација.
Напомена: Функција може и вратити другу функцију као повратну вредност, али ово понашање има неке додатне ефекте које би требало објаснити, а који превазилазе обим курса.
Овом лекцијом завршавамо тему везану за програмски језик JavaScript. У наредној теми ћеш применити све што је до сада обрађено у циљу програмирања разноврсних динамичких клијентских апликација.