Webbteknik 2

Laboration EXTRA FUNCTIONS

Extra - Förstå funktioner

Funktioner är byggstenarna i programmering. De låter oss kapsla in logik, återanvända kod och namnge våra handlingar. Men de kan också vara krångliga att förstå i början - data hoppar in och ut, och variabler lever och dör.

Här är övningar för att stärka din mentala modell av hur funktioner fungerar.

1 - Torrsimulering (Tracing)

När vi anropar en funktion pausar vi “huvudprogrammet”, hoppar in i funktionen, kör koden där, och hoppar sedan tillbaka.

Uppgift: Följ koden rad för rad. Vad är värdet av variablerna efter varje steg?

function magic(x, y) {
  let result = x + y;
  if (result > 10) {
    return result;
  }
  return 0;
}

let a = 5;
let b = 8;
let c = magic(a, b);
let d = magic(2, 3);

// Vad är värdet på a, b, c och d här?
Facit
  • a är 5 (Oförändrad)
  • b är 8 (Oförändrad)
  • c är 13 (magic(5, 8) -> 5+8=13. 13 > 10, så vi returnerar 13)
  • d är 0 (magic(2, 3) -> 2+3=5. 5 är inte > 10, så vi returnerar 0)

2 - Scope

En funktion utgör ett sk. scope (på svenska ungefär omfång). Ett scope definierar bland annat livslängden för variabler som skapas inom det. Dvs, variabler som skapas inuti en funktion är inte tillgängliga utanför den.

Uppgift: Titta på följande kod. Vad skrivs ut i konsolen?

let secret = "Hemlis";

function reveal() {
  let secret = "Överraskning!";
  console.log(secret);
}

reveal();
console.log(secret);
  1. Vad skriver reveal() ut?
  2. Vad skriver den sista console.log(secret) ut?
  3. Varför?
Facit
  1. reveal() skriver ut “Överraskning!”.
  2. console.log(secret) skriver ut “Hemlis”.
  3. Varför? Variabeln secret inuti funktionen är en ny, lokal variabel som bara finns inuti funktionen. Den “skuggar” (shadows) den yttre variabeln. Den yttre variabeln secret påverkas inte alls.

3 - Funktion eller Värde?

En vanlig fälla är att blanda ihop myFunction och myFunction().

Uppgift: Vad är skillnaden mellan rad A och rad B?

function greet() {
  return "Hej!";
}

let a = greet;   // Rad A
let b = greet(); // Rad B
Facit
  • Rad A: a blir en referens till själva funktionen. a är nu en funktion och kan anropas: a(). Vi har inte kört koden i greet än.
  • Rad B: b får resultatet av anropet. Koden i greet körs, returnerar “Hej!”, och b får värdet “Hej!”. b är en sträng, inte en funktion.