() => {} vs function
Funkcja zwykła ma własne this i arguments, jest wynoszona (hoisting) i można ją wywołać przez new. Funkcja strzałkowa jest krótsza i bierze this z otoczenia.
Porównanie w tabeli
#Własne this
Własne arguments
Wywołanie przez new
Wywołanie przed deklaracją
Niejawny return
Może być funkcją generatora
Typowe użycie
Przykład
#console.log(double(5))
function double(n) {
return n * 2
}
const triple = (n) => n * 3
console.log(triple(5))Definicja i zastosowanie
#Obie formy definiują funkcję: przyjmują parametry, wykonują instrukcje i mogą zwrócić wynik przez return. Deklaracja function i wyrażenie function () {} mają własne this i arguments, zależne od sposobu wywołania, a funkcja strzałkowa () => {} nie ma żadnego z nich: bierze this z kodu, w którym została zapisana.
Deklaracje function są wynoszone (hoisting) w całości, więc można je wywołać wyżej w pliku, niż je zapisano. Strzałka, zwykle przypisana do const, działa dopiero od linii przypisania. Funkcję zwykłą można też wywołać przez new jako konstruktor, a strzałkę nie: taka próba rzuca TypeError. Strzałka za to pozwala pominąć klamry i return dla ciała z jednym wyrażeniem.
W metodach obiektów i klas, które odwołują się do this, oraz w konstruktorach używaj function. W krótkich callbackach, zwłaszcza takich, które mają korzystać z this metody, w której są zagnieżdżone (np. w map() czy addEventListener()), sięgaj po strzałkę.
Składnia
#function name(param1, param2) {
return value
}
const name = (param1, param2) => valueWięcej przykładów
#const game = {
title: 'Kosmiczna wyprawa',
players: ['Ania', 'Kuba'],
announceWithArrow: function () {
return this.players.map((player) => `${this.title}: ${player}`)
},
announceWithFunction: function () {
return this.players.map(function (player) {
return `${this.title}: ${player}`
})
}
}
console.log(game.announceWithArrow())
try {
console.log(game.announceWithFunction())
} catch (error) {
console.log(error.name)
}Strzałka w map() bierze this z metody announceWithArrow(). Zwykła funkcja przekazana do map() dostaje własne this, które bez odbiornika jest undefined, więc this.title rzuca błąd.
function Player(name) {
this.name = name
}
const ArrowPlayer = (name) => {
this.name = name
}
const player = new Player('Ania')
console.log(player.name)
try {
new ArrowPlayer('Kuba')
} catch (error) {
console.log(error.name)
}Dobre praktyki
#- Metody obiektów i klas, które muszą znać swój
this, pisz przezfunctionalbo skrótmethod() {}, nie przez strzałkę. - W callbacku, który ma korzystać z
thisotaczającej metody (np. wewnątrzmap()w metodzie klasy), użyj strzałki. Zwykła funkcja dostałaby własne, innethis. - Potrzebujesz wywołać funkcję, zanim zostanie zapisana w pliku? Zadeklaruj ją przez
function, nie przypisuj jej doconstjako strzałki.
Powiązane hasła
#- functionDeklaruje nazwaną funkcję: blok kodu z parametrami, który można wywoływać wiele razy i który może zwrócić wynik.
- () => {}Funkcja strzałkowa (arrow function): krótszy zapis funkcji, bez własnego this, z niejawnym return dla jednego wyrażenia.
- returnKończy działanie funkcji i przekazuje wartość do miejsca, w którym funkcję wywołano.
- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
Widzisz błąd albo brakuje przykładu? Napisz do nas.