Sobes.tech
Junior

Jaký je rozdíl mezi šipkovými funkcemi a běžnými funkcemi v JavaScriptu?

sobes.tech AI

Odpověď od AI

  1. Syntax:
    • Obecná funkce: function myFunction() { ... }
    • Šipková funkce: () => { ... } nebo param => { ... }
  2. Kontext this:
    • Obecná funkce: this je určeno kontextem volání.
    • Šipková funkce: this je lexikálně děděno z okolního prostředí (nemá vlastní this).
  3. Konstruktory:
    • Obecná funkce: Může být použita jako konstruktor (new myFunction()).
    • Šipková funkce: Nemůže být použita jako konstruktor.
  4. Objekt arguments:
    • Obecná funkce: Má vlastní objekt arguments.
    • Šipková funkce: Nemá vlastní arguments, přístup k argumentům je přes rest parametry (...args).
  5. Pojmenované funkce:
    • Obecná funkce: Může být pojmenovaná (function myFunction() { ... }).
    • Šipková funkce: Je anonymní, přiřazuje se proměnné (const myFunction = () => { ... }).
  6. Implicitní návrat:
    • Obecná funkce: Vyžaduje explicitní return pro návrat hodnoty.
    • Šipková funkce: Při jednoslovném těle může implicitně vracet výsledek výrazu.

Porovnávací tabulka:

Charakteristika Obecná funkce Šipková funkce
Syntaxe function name() { ... } () => { ... }
Kontext this Dynamický (volání) Lexikální (z rodičovského prostředí)
Konstruktor Ano Ne
Objekt arguments Ano Ne (používá rest parametry)
Pojmenování Může být pojmenovaná Anonymní (přiřazena)
Implicitní návrat Ne (obvykle je třeba return) Ano (pro jednoslovné tělo)
// Příklady obecných funkcí
function standardFunction() {
  console.log(this); // Závisí na kontextu volání
  console.log(arguments); // Objekt arguments je dostupný
}

const obj = {
  method: standardFunction
};

standardFunction(); // this bude window nebo undefined
obj.method(); // this bude obj
new standardFunction(); // this bude nový objekt

// Příklady šipkových funkcí
const arrowFunction = () => {
  console.log(this); // Dědí z okolního prostředí
  // console.log(arguments); // Chyba, arguments není dostupný
};

const outerObj = {
  outerMethod: function() {
    const innerArrowFunction = () => {
      console.log(this); // dědí z outerMethod (outerObj)
    };
    innerArrowFunction();
  }
};

arrowFunction(); // this bude window nebo {} (v Node.js)
outerObj.outerMethod(); // this uvnitř innerArrowFunction bude outerObj

// Implicitní návrat v šipkové funkci
const sum = (a, b) => a + b;
console.log(sum(2, 3)); // 5

// Obecná funkce s explicitním návratem
function multiply(a, b) {
  return a * b;
}
console.log(multiply(2, 3)); // 6

// Šipková funkce nemůže být konstruktor
// new arrowFunction(); // Chyba: TypeError