Funkcje w JavaScript
Ten artykuł wyjaśnia funkcje w JavaScript.
YouTube Video
Funkcje w JavaScript
Funkcje w JavaScript to bloki wielokrotnego użytku, które służą do wykonywania określonych zadań. Używanie funkcji poprawia czytelność kodu i ułatwia jego utrzymanie. Funkcje można definiować na kilka sposobów i elastycznie nimi manipulować przy użyciu argumentów i wartości zwracanych.
Sposoby definiowania funkcji
Deklaracja funkcji
Funkcje można definiować za pomocą słowa kluczowego function
. Deklaracje funkcji są wynoszone (hoisted) przed wykonaniem kodu, dzięki czemu można je wywołać przed ich zdefiniowaniem.
1console.log(greet("Everyone")); // Hello, Everyone
2
3function greet(name) {
4 return "Hello, " + name;
5}
6
7console.log(greet("Alice")); // Hello, Alice
W tym przykładzie, ponieważ funkcja greet
jest wywoływana przed jej deklaracją, zostanie wyświetlone Hello, Everyone
oraz Hello, Alice
.
Wyrażenie funkcji
Funkcje można również definiować, przypisując je do zmiennej. W tym przypadku funkcja nie jest wynoszona i może zostać wywołana dopiero po jej zdefiniowaniu.
1const greet = function(name) {
2 return "Hello, " + name;
3};
4
5console.log(greet("Bob")); // Hello, Bob
W tym przykładzie zostanie wyświetlone Hello, Bob
.
Funkcja strzałkowa
Funkcje strzałkowe to sposób definiowania funkcji za pomocą krótszej składni. Są szczególnie przydatne przy użyciu funkcji anonimowych (funkcji bez nazwy). Funkcje strzałkowe mają również inne zachowanie w kontekście słowa kluczowego this
.
1const greet = (name) => {
2 return "Hello, " + name;
3};
4
5// When it can be expressed in a single line,
6// `return` and curly braces can be omitted
7const greetShort = name => "Hello, " + name;
8
9console.log(greet("Charlie")); // Hello, Charlie
10console.log(greetShort("Dave")); // Hello, Dave
Funkcje można zdefiniować jako greet
i greetShort
w tym przykładzie. Jeśli funkcja zajmuje jedną linię, można pominąć {}
(nawiasy klamrowe), jak w przypadku greetShort
.
Elementy funkcji
Argumenty
Wartości przekazywane do funkcji nazywane są argumentami. Określając argumenty podczas definiowania funkcji, można przekazać wartości podczas jej wywoływania.
1function add(a, b) {
2 return a + b;
3}
4
5console.log(add(2, 3)); // 5
Domyślne argumenty
Możesz określić domyślną wartość, jeśli żadna wartość nie zostanie przekazana do argumentów.
1function greet(name = "Guest") {
2 return "Hello, " + name;
3}
4
5console.log(greet()); // Hello, Guest
6console.log(greet("Alice")); // Hello, Alice
W tym przykładzie, jeśli wywołano greet()
, zostanie użyta domyślna wartość Guest
.
Wartość zwracana
Możesz zwrócić wartość zwracaną z funkcji, używając instrukcji return
. Jeśli nie ma instrukcji return
, funkcja zwraca undefined
.
1function greet(name) {
2 console.log('Hello, ' + name + '!');
3}
4function square(num) {
5 return num * num;
6}
7
8console.log(square(4)); // 16
9console.log(greet('Alice')); // undefined
W tym przykładzie, ponieważ funkcja greet
nie zwraca wartości, wartość zwracana to undefined
.
Funkcja anonimowa
Funkcja bez nazwy nazywana jest funkcją anonimową. Są często używane jako wyrażenia funkcyjne lub funkcje strzałkowe.
1const double = function(num) {
2 return num * 2;
3};
4
5console.log(double(5)); // 10
Natychmiastowo wywoływane wyrażenie funkcyjne (IIFE)
Natychmiastowo wywoływane wyrażenie funkcyjne (IIFE) to funkcja, która jest wykonywana natychmiast po jej zdefiniowaniu. Zazwyczaj jest używane do kontrolowania zakresu.
1/* Example of IIFE: Immediately Invoked Function Expression */
2(function() {
3 console.log("This is an IIFE");
4})(); // This is an IIFE
Jest wykonywane natychmiast po zadeklarowaniu.
Funkcja zwrotna
Przekazanie funkcji jako argumentu do innej funkcji w celu późniejszego wykonania nazywa się funkcją zwrotną. Jest często używana w przetwarzaniu asynchronicznym i obsłudze zdarzeń.
1function processData(callback) {
2 let data = "Processed Data";
3 callback(data);
4}
5
6processData(function(result) {
7 console.log(result); // Processed Data
8});
W tym przykładzie funkcja, która wypisuje wartość na konsolę, jest przekazywana jako funkcja zwrotna.
Funkcja rekurencyjna
Wywołanie funkcji przez samą siebie nazywamy rekurencją, a funkcję wykonującą powtarzalne przetwarzanie przy użyciu rekurencji - funkcją rekurencyjną. Na przykład funkcję obliczającą silnię można zaimplementować przy użyciu rekurencji, jak pokazano poniżej.
1function factorial(n) {
2 if (n === 0) {
3 return 1;
4 } else {
5 return n * factorial(n - 1);
6 }
7}
8
9console.log(factorial(5));
10// Output : 120
11// (5 * 4 * 3 * 2 * 1 = 120)
W tym przykładzie zostanie wyświetlona silnia z 5
, która wynosi 120
.
Słowo kluczowe this
this
użyte wewnątrz funkcji wskazuje, do którego obiektu odnosi się funkcja. W zwykłej funkcji odnosi się do obiektu wywołującego, ale w funkcjach strzałkowych zachowuje this
z zakresu, w którym została zdefiniowana.
1const obj = {
2 name: "Alice",
3 greet: function() {
4 console.log(this.name); // Refers to "Alice"
5 }
6};
7
8obj.greet(); // Alice
9
10const obj2 = {
11 name: "Bob",
12 greet: () => {
13 // Arrow function refers to the outer scope (undefined here)
14 console.log(this.name);
15 }
16};
17
18obj2.greet(); // undefined
greet
zmiennej obj
jest zadeklarowane przy użyciu słowa kluczowego function
. Dlatego słowo kluczowe this
odnosi się do obiektu zmiennej obj
. Z drugiej strony, greet
zmiennej obj2
jest zadeklarowane przy użyciu funkcji strzałkowej. Dlatego słowo kluczowe this
odnosi się do obiektu w zewnętrznym zakresie i jest undefined
w tym przykładzie.
Zakres funkcji i domknięcia
Zmienne zdefiniowane wewnątrz funkcji nie mogą być dostępne z zewnątrz funkcji. To nazywa się zakresem funkcji. Istnieje również cecha zwana domknięciem, która zachowuje zakres w momencie definiowania funkcji.
1function outer() {
2 let outerVar = "I am outer!";
3
4 function inner() {
5 console.log(outerVar); // Can access outerVar
6 }
7
8 return inner;
9}
10
11const innerFunc = outer();
12innerFunc(); // I am outer!
W tym przykładzie funkcja inner
może uzyskać dostęp do zmiennej outerVar
, ponieważ zachowuje zakres, w którym została zdefiniowana.
Podsumowanie
- Istnieją różne sposoby definiowania funkcji, w tym deklaracje funkcji, wyrażenia funkcyjne i funkcje strzałkowe.
- Funkcje mogą przyjmować argumenty i zwracać wartości.
- Istnieją specjalne zastosowania, takie jak funkcje zwrotne i funkcje rekurencyjne.
- Należy zachować ostrożność przy obsłudze
this
, ponieważ funkcje strzałkowe i zwykłe funkcje zachowują się inaczej. - Domknięcia mogą być używane do uzyskiwania dostępu do wewnętrznych zmiennych spoza zakresu.
Funkcje są jednym z ważnych pojęć w JavaScript, wykorzystując jego elastyczną strukturę.
Możesz śledzić ten artykuł, korzystając z Visual Studio Code na naszym kanale YouTube. Proszę również sprawdzić nasz kanał YouTube.