JavaScript funkcija je blok kode, zasnovan za izvajanje določene naloge. Definira se s ključno besedo
function, sledi ji ime in oklepaji (). Ime funkcije lahko vsebuje črke, številke,
podčrtaje in znak $ (enaka pravila kot za spremenljivke). V oklepajih se navedejo parametri, ločeni
z vejicami. Funkcije lahko vračajo vrednosti s stavkom return, sprejemajo druge funkcije kot argumente
(povratni klici) ali pa se shranijo v spremenljivke (funkcijski izrazi). ES6 je uvedel tudi
arrow funkcije (=>), ki omogočajo krajšo sintakso.
Funkcije v JavaScriptu lahko definiramo na več načinov: kot deklaracijo, izraz ali arrow funkcijo.
Vsaka vrsta ima svoje lastnosti glede dviganja (hoisting), uporabe this in sintakse.
Arrow funkcija (puščičasta funkcija) je sodobna, krajša sintaksa za pisanje funkcij, ki jo je uvedel ES6
(ECMAScript 2015). Zakaj se imenuje "arrow"? Ker uporablja puščico => namesto ključne besede <
code>function.
Glavne razlike:
function(x) { return x * x; }(x) => x * x; (če ima samo eno vrstico, return in
oklepaji za telo so avtomatski).this: (To je najpomembnejše!)
this, ki se spremeni glede na to,
kako jo pokličeš (npr. kot metodo objekta ali kot samostojno funkcijo).this. Podeduje
this iz okolice, kjer je definirana (lexical scoping). To je odlično za callback funkcije
(npr. v map, filter), kjer ne želiš, da se this spremeni.Funkcije v JavaScriptu so objekti, zato imajo lastnosti (npr. length, name) in metode
(npr. call(), apply(), bind()), ki omogočajo napredno uporabo.
Spodnja tabela prikazuje vse načine definiranja funkcij, parametre, lastnosti in metode. Za vsak element so navedeni opis, sintaksa in konkreten primer kode.
| Ime | Opis | Sintaksa | Primer |
|---|---|---|---|
| Deklaracija funkcije | Klasična definicija funkcije (dvignjena / hoisted). | function ime(parametri) { ... } |
function pozdrav(ime) { return "Zdravo, " + ime; } |
| Funkcijski izraz | Funkcija shranjena v spremenljivko (ni dvignjena). | let ime = function(parametri) { ... }; |
let vsota = function(a, b) { return a + b; }; |
| Arrow funkcija | Krajša sintaksa (ES6), ne vezuje lastnega this. |
let ime = (parametri) => izraz; |
let kvadrat = (x) => x * x; |
| Arrow (več vrstic) | Arrow funkcija z blokom kode in return. |
let ime = (parametri) => { ... return ...; }; |
let vsota = (a, b) => { let r = a + b; return r; }; |
| Anonimna funkcija | Funkcija brez imena (pogosta kot callback). | function(parametri) { ... } |
setTimeout(function() { alert("Konec!"); }, 1000); |
| IIFE | Takoj izvedena funkcija (Immediately Invoked). | (function() { ... })(); |
(function() { let x = 10; console.log(x); })(); |
| Parametri | Vrednosti, ki jih funkcija sprejme ob klicu. | function ime(param1, param2) { ... } |
function vsota(a, b) { return a + b; } |
| Privzete vrednosti | Vrednost, če argument ni podan (ES6). | function ime(param = vrednost) { ... } |
function pozdrav(ime = "Svet") { return "Zdravo, " + ime; } |
| Rest parametri | Zbere preostale argumente v tabelo (ES6). | function ime(...args) { ... } |
function vsota(...stevila) { return stevila.reduce((a,b) => a+b); } |
| arguments objekt | Star način za dostop do vseh argumentov (ni prava tabela). | arguments[i] |
function vsi() { return arguments[0]; } |
| return | Vrne vrednost in konča funkcijo. | return vrednost; |
function kvadrat(x) { return x * x; } |
| Brez return | Funkcija vrne undefined. |
function ime() { ... } |
function pozdrav() { console.log("Zdravo"); } // vrne undefined |
| length | Vrne število pričakovanih parametrov. | funkcija.length |
function vsota(a, b) {} vsota.length; // 2 |
| name | Vrne ime funkcije kot niz. | funkcija.name |
function pozdrav() {} pozdrav.name; // "pozdrav" |
| prototype | Omogoča dodajanje lastnosti, če se funkcija uporabi kot konstruktor. | funkcija.prototype |
Oseba.prototype.leto = 2024; |
| constructor | Vrne funkcijo, ki je ustvarila prototip. | funkcija.constructor |
pozdrav.constructor; // function Function() { ... } |
| call() | Kliče funkcijo z določenim this in posameznimi argumenti. |
funkcija.call(thisArg, arg1, arg2) |
pozdrav.call(oseba, "Ana"); |
| apply() | Kliče funkcijo z določenim this in tabelo argumentov. |
funkcija.apply(thisArg, [arg1, arg2]) |
pozdrav.apply(oseba, ["Ana"]); |
| bind() | Vrne novo funkcijo z vezanim this (ne kliče je). |
funkcija.bind(thisArg, arg1) |
let vezana = pozdrav.bind(oseba); vezana("Ana"); |
| toString() | Vrne izvorno kodo funkcije kot niz. | funkcija.toString() |
pozdrav.toString(); // "function pozdrav() { ... }" |
| Closure | Funkcija si zapomni spremenljivke iz zunanjega obsega. | function zunanja() { let x = 10; return function() { return x; }; } |
function stevec() { let i = 0; return () => ++i; } let c = stevec(); c(); // 1 |
| Callback | Funkcija, podana kot argument drugi funkciji. | funkcija(callback) |
arr.forEach(function(el) { console.log(el); }); |
| Rekurzija | Funkcija kliče samo sebe. | function ime() { ... ime(); } |
function fakt(n) { return n <= 1 ? 1 : n * fakt(n-1); } |
Ali moram vedno uporabiti return? |
Ne. Če funkcija ne vrača vrednosti, se privzeto vrne undefined. |
|---|---|
| Kaj je “anonimna funkcija”? | Funkcija brez imena, npr. function(a,b){ return a+b; }. Pogosto se uporablja kot argument
drugih funkcij. |
| Kako pretvorim funkcijo v spremenljivko? | Preprosto ji dodelim: let sq = function(x){ return x*x; }; |