{Функции}

Функция е относително самостоятелна част от кода, имаща уникално име и даваща възможност да бъде стартирана произволен брой пъти.
Функциите са основните „градивни елементи“ на програмата. Те позволяват кодът да бъде извикан много пъти без повторение.

Декларация на функция

Синтаксис: function functionName(parameters){ … code …}

Пример: Необходимо е на различни места в страницата да се извежда едно и също съобщение ‘Операцията премина успешно!’

function showSuccessMsg(){
  alert('Операцията премина успешно!')
}

showSuccessMsg();
showSuccessMsg();

Извикването showSuccessMsg () изпълнява кода на функцията. Тук ще видим съобщението два пъти.
Този пример ясно показва една от основните цели на функциите: да се избегне дублирането на код.
Друга полза от използването на функция е, че ако някога се наложи да променим съобщението или начина, по който то се извежда, достатъчно е да променим кода на едно място: функцията, която го извежда.

Локални (вътрешни) променливи

Променлива, която е декларирана във функция, е видима само за тази функция.

function showMessage() {
  let message = "Тhe operation passed successfully!"; // локална променлива(local variable)

  alert( message );
}

showMessage(); // Тhe operation passed successfully!

alert( message ); // ReferenceError: message is not defined (променливата message не е видима извън функцията)

Глобални (външни) променливи

Функциите имат достъп до променливи, декларирани извън тях.

let userName = 'Румен';

function showMsg() {
  let message = 'Здравей, ' + userName;
  alert(message);
}

showMsg(); // Здравей, Румен

Освен това, функциите имат пълен достъп до глобалните променливи. Т.е. те могат не само да ги четат, но и да ги променят.

let userName = 'Румен';

function showMsg() {
  userName = 'Росен';
  let message = 'Здравей, ' + userName;
  alert(message);
}

alert(userName); //  Румен
showMsg(); // Здравей, Росен
alert(userName); //  Росен

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

let userName = 'Румен';

function showMsg() {
  let userName = 'Росен';
  let message = 'Здравей, ' + userName;
  alert(message);
}

showMsg(); // Здравей, Росен
alert(userName); //  Румен

Обобщено:
* Глобалните променливи се виждат от всяка функция (освен ако не са „покрити“ от локални променливи).
* Обикновено във функцията се декларират всички променливи, специфични за нейната задача.
* Глобалните променливи съхраняват само данни на ниво проект и е важно тези променливи да са достъпни от всяко място.
* Модерният код има малко или никакви глобални променливи.

Параметри

Функциите могат да приемат външни данни посредством своите параметри.

function showMsg(from, text) { //  параметри на функцията: from, text
  alert(from + ': ' + text);
}
showMsg('Ива', 'Здравей!'); // Ива: Здравей! (4)
showMsg('Мария', "What's up?"); // Мария: What's up? (5)

В примера, функцията има два параметъра – from и text. Когато функцията бъде извикана в редове 4 и 5, стойностите в скобите се присвояват на локалните променливи (параметри) на функцията. Тези стойности се наричат аргументи.

Стойности по подразбиране

Ако на даден параметър не е зададена стойност, то неговата стойност е undefined.
Например функцията от предишната точка може да се извика с един аргумент:

showMsg('Иван');

Това не е грешка, при извикването си функцията ще изведе: Иван:undefined.
В случая може да се зададе стойност по подразбране на параметъра text по следния начин:

function showMessage(from, text = "Няма въведен текст.") {
  alert( from + ": " + text );
}

showMessage("Иван"); // Иван: Няма въведен текст.

В този случай, ако няма зададен аргумент за text, функцията ще изведе стойността по подразбиране: „Няма въведен текст.“
Стойностите по подразбиране биха могли да бъдат по-сложни изрази, или дори функции:

function showMessage(from, text = anotherFunction()) {
  // anotherFunction() ще се изпълни само ако няма зададен аргумент за параметъра text
  // резултатът от нея ще бъде стойност на параметъра
}

В JavaScript, параметърът по подразбиране се оценява всеки път, когато функцията се извика без съответния параметър. В примера по-горе, anotherFunction () се изпълнява всеки път, когато showMessage () се извика без параметъра text. Това е в контраст с някои други езици като Python, където всички параметри по подразбиране се оценяват само веднъж по време на първоначалната интерпретация.

Връщане на стойност

Функцията може като резултат от изпълнението си да върне стойност към извикващия код. Например:

function sum(a, b) {
  return a + b;
}

let result = sum(1, 2);
alert( result ); // 3

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

Може да има много случаи за връщане на стойност:

function checkAge(age) {
  if (age > 18) {
    return true;
  } else {
    return confirm('Do you have permission from your parents?');
  }
}

let age = prompt('How old are you?', 18);

if ( checkAge(age) ) {
  alert( 'Access granted' );
} else {
  alert( 'Access denied' );
}

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

Функция с return без стойност или без return, връща undefined.

Именуване на функции

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

  • "get…" – връща стойност
  • "calc…" – функция, която изчислява нещо
  • "create…" – функция, която създава нещо
  • "check…" – функция за проверка, която връща логическа стойност
  • и т.н.

Задача 1. Напишете функция getMin(a, b), която връща по-малкото от две числа.

Задача 2. Напишете функция calcPower(x, n), която изчислява x на степен n.

Задача 3. Да се напише функция reverseNum, която изписва цяло число в обратен ред.
Да се наpише скрипт, който изисква въвеждане на две числа, след което използвайки функцията reverseNum(), извежда сумата на огледалните им стойности по следния шаблон:
Вход: 12, 32 Изход: 21 + 23 = 44

Задача 4. Да се напише функция, която подрежда символите в низ по азбучен ред.
Вход: авдб Изход: абвд

Задача 5. Да се напише функция getSentenceCase, която приема низ и го извежда като прави главна първата буква на всяка дума.
Да се напише функция clrSpaces, която премахва всички излишни интервали в низ.
Да се напише скрипт, който използва двете функции върху низ, който се въвежда през prompt().