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!
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 😅).
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" 💡.
JESZCZE RAZ. POWOLI!
OK 😄! Wyrażenie lambda w języku JavaScript, to pisząc łopatologicznie 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!
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ę 😁!
PRZYKŁAD KODU ŹRÓDŁOWEGO
Skoro wytłumaczyłem na czym z grubsza polega wyrażenie lambda w języku JavaScript, przejdźmy teraz do kodu źródłowego. Lambdę możesz ujrzeć 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ę.
ZASADY
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ł 🫵.
NAWIASY OTACZAJĄCE PARAMETRY
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!");NAWIASY OTACZAJĄCE KOD
Teraz nawiasy klamrowe otaczające kod funkcji. Wyrażenie lambda w języku JavaScript nie wymaga ich, jeśli składa się z pojedynczej instrukcji 👇:
const getMultiplicationOf = (x, y) => x*y;aczkolwiek zacznie się ich dopominać, jeśli umieścimy musimy zdefiniować 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.
ZALETY STOSOWANIA LAMBDY
Tutaj wyrażenie lambda w języku JavaScript ma się czym pochwalić co do zalet 😊.
1. MNIEJ KODU, A DZIAŁANIE TO SAMO
Pierwsza i najważniejsza zaleta 1️⃣: efektywne skracanie kodu do samego meritum sprawy 🤩. 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**2Prawda 🙂? Nic więcej!
A popatrz teraz 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 😊.
2. 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(actions) {
console.log("Cześć wszystkim!");
actions();
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" 🎒.
3. "Ł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 🔥.
MINUSY
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".
Lambda nie jest traktowana tak samo, jak metoda! Jest jeszcze parę innych czynników, natomiast 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 ✍️.