Programare funcțională
Funcții
Funcțiile reprezintă un set de instrucțiuni care pot fi apelate repetat în diferite părți ale programului prin numele funcției. În general, sintaxa de definire a unei funcții arată astfel:
function nume_funcție(parametri){
// Instrucțiuni
}
Definirea funcției începe cu cuvântul cheie function, urmat de numele funcției. Numele funcției respectă aceleași reguli ca și numele variabilelor: poate conține doar cifre, litere, caractere de subliniere și dolar ($) și trebuie să înceapă cu o literă, caracter de subliniere sau dolar.
După numele funcției, în paranteze, urmează o listă de parametri. Chiar dacă funcția nu are parametri, se folosesc tot parantezele goale. Apoi, în acolade, se află corpul funcției, care conține setul de instrucțiuni.
Să definim o funcție simplă:
function salut(){
console.log("Salut, FDC.com");
}
Această funcție se numește salut(). Ea nu primește niciun parametru și tot ce face este să afișeze în consolă șirul de caractere "Salut, FDC.com".
Pentru ca funcția să-și facă treaba, trebuie să o apelăm. Sintaxa generală de apelare a unei funcții este:
nume_funcție(parametri)
La apel, după numele funcției, în paranteze, se specifică lista de parametri. Dacă funcția nu are parametri, se folosesc parantezele goale.
De exemplu, să definim și să apelăm o funcție simplă:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>FDC.COM</title>
</head>
<body>
<script>
// Definirea funcției
function hello(){
console.log("Salut, FDC.com");
}
// Apelarea funcției
hello();
</script>
</body>
</html>
În acest caz, funcția "hello" nu primește niciun parametru, așadar la apelul său se specifică paranteze goale:
O caracteristică distinctivă a funcțiilor este că pot fi apelate de mai multe ori în diferite locuri ale programului:
// definirea funcției
function hello(){
console.log("Salut Metanit.com");
}
// apelarea funcției
hello();
hello();
hello();
Variabilele și constantele ca funcții
Asemenea variabilelor și constantelor cărora li se atribuie valori simple (numere, șiruri etc.), le putem atribui și funcții. Apoi, prin intermediul unei astfel de variabile sau constante, putem apela funcția atribuită:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>METANIT.COM</title>
</head>
<body>
<script>
// definirea funcției
function hello(){
console.log("Salut de la Metanit.com");
}
// atribuirea constantei message referința la funcția hello
const message = hello;
message(); // apelăm funcția, referința către care este stocată în constanta message
</script>
</body>
</html>
Atribuind unei constante sau variabile o funcție:
const message = hello;
Apoi putem apela această funcție prin numele constantei/variabilei:
message();
De asemenea, putem schimba dinamic funcțiile care sunt stocate într-o variabilă:
function goodMorning(){
console.log("Bună dimineața");
}
function goodEvening(){
console.log("Bună seara");
}
let message = goodMorning; // atribuim variabilei message funcția goodMorning
message(); // Bună dimineața
message = goodEvening; // schimbăm funcția în variabila message
message(); // Bună seara
Funcții exprimate și funcții anonime
Nu este neapărat să atribuim nume funcțiilor. Putem utiliza funcții anonime. Aceste funcții, atunci când sunt definite, sunt atribuite unei constante sau variabile. Aceste funcții mai sunt numite funcții exprimate (function expression):
const message = function(){
console.log("Salut JavaScript");
}
message();
Folosind numele constantei sau variabilei căreia i s-a atribuită funcția, putem apela această funcție.
Funcții locale
JavaScript permite definirea funcțiilor locale - funcții în interiorul altor funcții. Funcțiile locale sunt vizibile doar în cadrul funcției externe în care sunt definite. De exemplu:
function print(){
printHello();
printHello();
printHello();
function printHello(){
console.log("Salut");
}
}
print();
printHello(); // Uncaught ReferenceError: printHello is not defined - funcția locală poate fi apelată doar din funcția înconjurătoare
Aici, în interiorul funcției print, este definită funcția locală printHello, care afișează doar șirul "Salut". În interiorul funcției print, putem apela funcția locală printHello, însă în afara funcției înconjurătoare, funcția locală nu poate fi apelată.
Acest exemplu este destul de simplu și nu are un mare sens. Cu toate acestea, de obicei, funcțiile locale sunt definite pentru acțiuni care sunt aplicate de mai multe ori doar în cadrul unei anumite funcții și nicăieri altundeva. Un dezavantaj al funcțiilor locale poate fi că acestea sunt create de fiecare dată când este efectuată apelarea funcției externe.