Wyrażenie lambda jest kolejnym fragmentem układanki w języku JavaScript. To nie jest temat, bez którego nie można stworzyć żadnej aplikacji, natomiast otwiera wrota do pisania O WIELE lepszego kodu 🧨!!! Dowiedz się do czego służy funkcja "strzałkowa" i co nam fajnego może dać 😊.
WYRAŻENIE LAMBDA W JĘZYKU JAVASCRIPT TO "DRZWI" DO PROGRAMOWANIA FUNKCYJNEGO!
Jak zwykle, wpierw pojęcie, a potem przykłady 😉.
CZYM JEST WYRAŻENIE LAMBDA W JĘZYKU JAVASCRIPT?
Wyrażenie lambda (nazywane też "funkcją strzałkową", "funkcją anonimową" albo skrótowo "lambdą") to funkcja zdefiniowana bezpośrednio w miejsce parametru innej funkcji ℹ️. Pozwala to definiować serię instrukcji co każde osobne wywołanie tej samej funkcji, która przyjmuje za parametr referencję do funkcji (nie samą funkcję, bo to działanie na wskaźnikach przypominam 😅).
Pisząc jeszcze inaczej, wyrażenie lambda to możliwość wprowadzania kodu jako parametru funkcji w momencie jej wywoływania. Oznacza to, że co każde nowe wywołanie funkcji, może się wykonywać coś ZUPEŁNIE innego, mimo wtłoczonego kodu wewnątrz funkcji!
W języku JavaScript (jak i w wielu innych językach) jest możliwe przekazywanie funkcji jako parametr i to jest ważny składnik paradygmatu funkcyjnego polegającego na wykorzystywaniu tzw. funkcji wyższego rzędu - funkcji, która oczekuje innej funkcji jako parametru bądź zwraca ją na wyjściu używając instrukcji "return" 💡.
Co ważne, jest to bezpośrednie "wszczepienie" tej funkcji do funkcji 🙃. Bo można też zdefiniować funkcję poza miejsce parametru, która jej oczekuje i tam przypisać jej nazwę, lecz wtedy to nie będzie już wyrażenie lambda! Ono się tym charakteryzuje, że nie posiada swojej nazwy (identyfikatora), tylko jest już osadzone w parametrze i tej nazwy nie potrzebuje ✅.
Ta "wymiana" kodu działa jak kartridż w konsoli 🎮. Konsola ma to samo zadanie - wyświetlić obraz gry i ją wczytać, natomiast zawartość zależy od samego kartridża. To taki parametr funkcyjny będzie naszym "kartridżem", a funkcja wywoływana, "konsolą". No prościej już naprawdę nie mogę 😁!
Skoro wytłumaczyłem na czym z grubsza polega wyrażenie lambda w języku JavaScript, przejdźmy teraz do kodu źródłowego 🎬.
JAK UTWORZYĆ WYRAŻENIE LAMBDA W JĘZYKU JAVASCRIPT?
W języku JavaScript, wyrażenie lambda możesz utworzyć w dwóch następujących postaciach 👇:
- jako funkcję anonimową:
const getSquareOf = function(n) { return n**2; }; - jako funkcję "strzałkową":
const getSquareOf = n => n**2;
Pojęcie funkcji "strzałkowej" pochodzi od znaku charakterystycznej "strzałki" będącej kombinacją znaku równości i znaku większości ("=>"). Jest ona obowiązkową częścią składni, jeśli definiujemy taką funkcję.
Zanim przejdziemy do zalet stosowania wyrażeń lambda (zwłaszcza tej drugiej postaci), omówię na szybko kilka zasad składniowych, których interpreter będzie od Ciebie wymagał 🫵.
JAKIE SĄ REGUŁY STOSOWANIA NAWIASÓW W WYRAŻENIACH LAMBDA W JĘZYKU JAVASCRIPT?
Istnieją 2 zasady co do stosowania nawiasów w wyrażeniach lambda, których konieczność wstawienia zależy od okoliczności 👇:
- otoczenie parametrów nawiasami okrągłymi,
- otoczenie instrukcji nawiasami klamrowymi.
Teraz prezentuję przykłady ⏩!
NAWIASY OTACZAJĄCE PARAMETRY WYRAŻENIA LAMBDA W JĘZYKU JAVASCRIPT
Zdążyłeś(-aś) pewnie zauważyć jeden szczegół co do przykładu powyżej. Brak nawiasów okrągłych wokół parametru "n" 😳! Tak, można pominąć, lecz wtedy i tylko wtedy, gdy lambda przyjmuje wyłącznie JEDEN parametr! Jeżeli są 2 lub więcej, wtedy trzeba już je wstawić 👇:
const getMultiplicationOf = (x, y) => x*y;jak zero parametrów, też:
const writeText = () => console.log("Wypisuję tekst!");Teraz nawiasy klamrowe otaczające kod funkcji.
NAWIASY OTACZAJĄCE KOD WYRAŻENIA LAMBDA W JĘZYKU JAVASCRIPT
Wyrażenie lambda w języku JavaScript nie wymaga klamerek, jeśli składa się ona z pojedynczej instrukcji 👇:
const getMultiplicationOf = (x, y) => x*y;aczkolwiek zacznie się ich dopominać, jeśli zdefiniujemy blok:
const getMultiplicationOf = (x, y) => {
return x*y;
};Spójrz uważnie na słowo "return" 💥! Jeżeli lambda przyjmuje 2 lub więcej instrukcji, wtedy MUSIMY wstawić dodatkowe słowo do zwracania wartości 🔥!
Dlaczego przy jednej instrukcji nie musimy? Bo JavaScript "domyśli się" wtedy, że podane wyrażenie ma być zwracane.
JAKIE SĄ ZALETY WYRAŻEŃ LAMBDA W JĘZYKU JAVASCRIPT?
Tutaj wyrażenie lambda w języku JavaScript ma się czym pochwalić co do zalet 😊:
- możliwość implementacji przy użyciu mniejszego kodu,
- możliwość przekazywania kodu jako parametr innej funkcji (tzw. "funkcji wyższego rzędu"),
- możliwość użycia "łańcucha wywołań" (ciągu wywołań metod bez konieczności przypisywania częściowych wyników na uboczu).
Opisuję dokładniej każdą z nich 💛.
MNIEJ KODU, A DZIAŁANIE TO SAMO
Pierwsza i najważniejsza zaleta 1️⃣: efektywne skracanie kodu do samego meritum 🤩. Weźmy pod lupę funkcję zwracającą kwadrat podanej liczby w postaci funkcji anonimowej 👇:
const getSquareOf = function(n) {
return n**2;
};Co widzimy? Słowa kluczowe "function", "return" i całą resztę budowy. Standard. Nie sądzisz, że może to niepotrzebnie ściągać na siebie uwagę 🤔? Bo co tutaj się tak naprawdę liczy? Sama kalkulacja:
n**2Nic więcej 🙂!
A teraz spójrz na postać funkcji strzałkowej:
const getSquareOf = n => n**2;O niebo lepiej 🌟! Skupiamy się tylko na konkretach. Funkcja, podaję Ci liczbę N i masz mi zwrócić kwadrat tej liczby. Przyjmuje "n", zwraca kwadrat ✅. Dziękuję, do widzenia 😊.
PRZEKAZYWANIE KODU JAKO PARAMETR
I to jest druga ogromna zaleta stosowania funkcji strzałkowych 2️⃣. Możemy do innej funkcji przekazać nie wartość, a kod do wykonania (metafora kartridża i konsoli, pamiętasz 😜?)!
Przypuśćmy, że codziennie widzisz grupę swoich ulubionych ziomków 👊. Witacie się, spędzacie ze sobą czas i się żegnacie. Jak mogłaby wyglądać taka funkcja strzałkowa? Popatrz 👇:
function spendTimeWithBuddies(action) {
console.log("Cześć wszystkim!");
action();
console.log("Widzimy się jutro!");
}Wywołanie parametru w ujęciu dosłownym! Czyli parametr jest funkcją wywoływaną w środku funkcji, która tego oczekuje (innymi słowy, jest funkcją wyższego rzędu). Teraz wywołując taką funkcję, będziemy mogli zdecydować co chcemy robić. Innego dnia możemy iść na pizzę, innego zagrać w bilard, a 2 dni później pójść na imprezę:
spendTimeWithBuddies(() => console.log("Idziemy na pizzę!"));
spendTimeWithBuddies(() => console.log("Gramy partyjkę w bilarda!"));
spendTimeWithBuddies(() => console.log("Chodźmy na imprezę!"));Wszystko "legitne" 😉! To zdecydowanie poszerza nasze możliwości do programowania uniwersalnego, aby się najzwyczajniej w świecie nie powtarzać i nie definiować bardzo podobnych funkcji, tylko stworzyć jedną, która będzie miała "kieszonkę" do definiowania różnych "podfunkcji" 🎒.
"ŁAŃCUCHY" WYWOŁAŃ
Ostatnia zaleta, o jakiej muszę wspomnieć 3️⃣, to wspieranie jednowierszowych ciągów wywołań różnych funkcji. Metody tablicowe, takie jak "forEach", "map" albo "filter" doskonale komponują się z wyrażeniami lambda, więc przy ich odpowiednim użyciu, można bez kitu sobie uprzyjemnić życie i sprowadzić wiele czynności do jednej linijki kodu (tworzy się taki "łańcuszek" wywołań).
Prosty przykład - przefiltrowanie wszystkich liczb większych od 40 i wypisanie ich na konsolę. Dwuetapowy przebieg, który brzmi jak wymagający dwóch pętli "for", nie? Zobacz na to 👇:
const numbers = [5, 18, 706, 46];
numbers.filter(e => e > 40).forEach(e => console.log(e));Jeden ciąg używający dwóch metod dla wspomnianych dwóch kroków: najpierw filtracja ("filter"), potem wypisanie ("forEach"). Ile to zajmuje wierszy? Jeden 💥. Ile pętli? Zero 🔥.
JAKIE SĄ WADY WYRAŻEŃ LAMBDA W JĘZYKU JAVASCRIPT?
Też są. Przede wszystkim, wyrażenie lambda w języku JavaScript to nie jest konstruktor! Zabrania się używania na nim słowa kluczowego "new". Oprócz tego, nie może być używany jako metoda, zwłaszcza podczas korzystania z takich metod, jak 👇:
- bind,
- call,
- apply.
Wyrażenie lambda nie jest traktowane tak samo, jak metoda 🔥! Jest jeszcze parę innych czynników, natomiast po szczegóły w tej materii, zaproszę Cię do oficjalnej dokumentacji 📖.
Wyrażenie lambda umożliwia przekazywanie samego kodu jako parametru innej funkcji, a on może być za każdym razem inny co kolejne wywołanie!
Na tym kończę rozdział o wyrażeniach lambda 😄. Nie musisz się od razu w całości przestawiać na programowanie funkcyjne, natomiast jeśli chodzi o samą możliwość przekazywania kodu jako parametru, na pewno warto to wprowadzić do swojego stylu pisania ✍️.