Wat zijn functies?

Een functie is een herbruikbaar stuk code dat je een naam geeft. Zodra je de functie aanroept, wordt de code erin uitgevoerd.

Waarom functies gebruiken?
  • Herbruikbaar — schrijf code één keer, gebruik meerdere keren
  • Overzichtelijk — geef complexe acties een duidelijke naam
  • Onderhoudbaar — aanpassen op één plek, werkt overal
  • Testbaar — je kunt elke functie apart testen

Zonder en met functie

Stel je berekent de btw van meerdere producten. Zonder functie herhaal je steeds dezelfde code:

// Zonder functie:
const prijs1 = 100 * 1.21;
const prijs2 = 85 * 1.21;
const prijs3 = 60 * 1.21;

// Met functie:
function berekenBtw(prijs) {
  return prijs * 1.21;
}

const prijs1 = berekenBtw(100);
const prijs2 = berekenBtw(85);
const prijs3 = berekenBtw(60);

Functie declaratie

De eenvoudigste manier om een functie te maken is met het function keyword.

function begroet() {
  console.log('Hallo wereld!');
}

// Functie aanroepen:
begroet(); // "Hallo wereld!"
begroet(); // "Hallo wereld!" (nogmaals)
Uitleg:
  • function — keyword om een functie te maken
  • begroet — de naam van de functie
  • () — haakjes voor parameters (hier leeg)
  • { ... } — de code die wordt uitgevoerd
  • begroet() — aanroepen met haakjes
Let op: een functie definiëren voert de code niet uit. Je moet de functie apart aanroepen.

Parameters

Met parameters geef je informatie mee aan een functie. Je definieert ze tussen de haakjes.

function begroetPersoon(naam) {
  console.log(`Hallo ${naam}!`);
}

begroetPersoon('Jan');   // "Hallo Jan!"
begroetPersoon('Lisa');  // "Hallo Lisa!"

Meerdere parameters

function stelVoor(naam, leeftijd, stad) {
  console.log(`Ik ben ${naam}, ${leeftijd} jaar en woon in ${stad}.`);
}

stelVoor('Jan', 25, 'Amsterdam');
// "Ik ben Jan, 25 jaar en woon in Amsterdam."
Parameter vs argument
  • Parameter: de variabelenaam in de functiedefinitie (naam)
  • Argument: de echte waarde die je meegeeft bij aanroep ('Jan')

Wat als je geen argument meegeeft?

function begroet(naam) {
  console.log(`Hallo ${naam}!`);
}

begroet(); // "Hallo undefined!"
Als je geen argument meegeeft is de parameter undefined. Gebruik default parameters om dit op te vangen (zie volgende sectie).

Return waarde

Met return geeft een functie een waarde terug. Die waarde kun je opslaan in een variabele of direct gebruiken.

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

const resultaat = optellen(3, 4);
console.log(resultaat); // 7

// Of direct gebruiken:
console.log(optellen(10, 5)); // 15

Return stopt de functie

function controleerLeeftijd(leeftijd) {
  if (leeftijd < 0) {
    return 'Ongeldige leeftijd';
  }

  if (leeftijd < 18) {
    return 'Minderjarig';
  }

  return 'Volwassen';
}

console.log(controleerLeeftijd(-5)); // "Ongeldige leeftijd"
console.log(controleerLeeftijd(16)); // "Minderjarig"
console.log(controleerLeeftijd(25)); // "Volwassen"
Zodra JavaScript een return tegenkomt, stopt de functie direct. Code na een return wordt niet meer uitgevoerd.

Functies zonder return

function toonBericht(tekst) {
  console.log(tekst); // alleen een actie, geen return
}

const uitkomst = toonBericht('Hallo');
console.log(uitkomst); // undefined
Een functie zonder return geeft automatisch undefined terug. Dat is prima als je alleen een actie wilt uitvoeren (zoals iets tonen of opslaan).

Default parameters

Met default parameters geef je een standaardwaarde aan een parameter. Die wordt gebruikt als er geen argument is meegegeven.

function begroet(naam = 'bezoeker') {
  console.log(`Hallo ${naam}!`);
}

begroet('Jan');   // "Hallo Jan!"
begroet();        // "Hallo bezoeker!"

Meerdere defaults

function maakProfiel(naam = 'Onbekend', rol = 'gebruiker', actief = true) {
  return {
    naam,
    rol,
    actief
  };
}

console.log(maakProfiel('Jan', 'admin'));
// { naam: 'Jan', rol: 'admin', actief: true }

console.log(maakProfiel());
// { naam: 'Onbekend', rol: 'gebruiker', actief: true }

Default met berekening

function berekenKorting(prijs, kortingPercentage = 10) {
  const korting = prijs * (kortingPercentage / 100);
  return prijs - korting;
}

console.log(berekenKorting(100));     // 90 (10% korting)
console.log(berekenKorting(100, 20)); // 80 (20% korting)

Arrow functions

Arrow functions zijn een kortere schrijfwijze voor functies. Ze zijn de standaard in moderne JavaScript.

Vergelijking

// Gewone functie:
function optellen(a, b) {
  return a + b;
}

// Arrow function (zelfde resultaat):
const optellen = (a, b) => {
  return a + b;
}

// Arrow function (nog korter, één regel):
const optellen = (a, b) => a + b;
Bij één expressie mag je de accolades {} en het return keyword weglaten. De waarde wordt automatisch teruggegeven.

Varianten

// Geen parameters: lege haakjes verplicht
const zegHallo = () => console.log('Hallo!');

// Één parameter: haakjes mogen weg
const verdubbel = n => n * 2;

// Meerdere parameters: haakjes verplicht
const optellen = (a, b) => a + b;

// Meerdere regels: accolades en return verplicht
const berekenBtw = (prijs) => {
  const btw = prijs * 0.21;
  return prijs + btw;
};

Arrow functions met array methods

const getallen = [1, 2, 3, 4, 5];

const even = getallen.filter(n => n % 2 === 0);
const verdubbeld = getallen.map(n => n * 2);

console.log(even);       // [2, 4]
console.log(verdubbeld); // [2, 4, 6, 8, 10]

Scope

Scope bepaalt waar een variabele beschikbaar is. Er zijn twee soorten: globale scope en lokale (function) scope.

Globale scope

const naam = 'Jan'; // globale variabele

function toonNaam() {
  console.log(naam); // werkt! naam is globaal beschikbaar
}

toonNaam(); // "Jan"
console.log(naam); // "Jan"

Lokale scope

function maakVariabele() {
  const lokaal = 'ik ben lokaal';
  console.log(lokaal); // werkt
}

maakVariabele();
console.log(lokaal); // ERROR: lokaal is not defined
Variabelen die je binnen een functie declareert, bestaan alleen binnen die functie. Van buiten zijn ze niet beschikbaar.

Block scope met let en const

if (true) {
  let blockVar = 'binnen blok';
  const blockConst = 'ook binnen blok';
  console.log(blockVar); // werkt
}

console.log(blockVar);   // ERROR: niet beschikbaar
console.log(blockConst); // ERROR: niet beschikbaar

Lokale variabele heeft voorrang

const kleur = 'rood'; // globaal

function schilderij() {
  const kleur = 'blauw'; // lokaal
  console.log(kleur);    // "blauw" — lokaal wint
}

schilderij();
console.log(kleur); // "rood" — globaal onveranderd

Hoisting

Hoisting is het gedrag waarbij JavaScript functiedeclaraties naar boven "verplaatst" vóór de code wordt uitgevoerd. Daardoor kun je een functie aanroepen vóórdat je hem gedeclareerd hebt.

Functiedeclaraties worden gehoist

// Aanroep vóór declaratie — werkt!
console.log(optellen(3, 4)); // 7

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

Arrow functions worden NIET gehoist

// Aanroep vóór declaratie — werkt NIET
console.log(aftrekken(10, 3)); // ERROR: Cannot access before initialization

const aftrekken = (a, b) => a - b;
Best practice: declareer functies altijd bovenaan je bestand, zodat je nooit verrast wordt door hoisting-gedrag. Dan werkt het altijd, of je nu een functiedeclaratie of arrow function gebruikt.

Overzicht

Type Syntax Gehoist?
Functiedeclaratie function naam() {} Ja
Arrow function const naam = () => {} Nee
Function expression const naam = function() {} Nee

Samenvatting

Concept Beschrijving Voorbeeld
Declaratie Functie definiëren function naam() {}
Aanroep Functie uitvoeren naam()
Parameter Invoer voor de functie function naam(a, b)
Return Waarde teruggeven return a + b;
Default parameter Standaardwaarde als argument ontbreekt function naam(a = 10)
Arrow function Korte schrijfwijze const naam = (a, b) => a + b;
Scope Bereik van een variabele Lokaal vs globaal