Ονοματοδοτημένες Συναρτησιακές Εκφράσεις στην JavaScript
Ας υποθέσουμε ότι έχουμε μια συναρτησιακή έκφραση όπως η ακόλουθη:
let test = function() {
console.log('!');
};
test(); // θα εμφανίσει '!'
Ας δώσουμε ένα όνομα func στη συνάρτησή μας:
let test = function func() {
console.log('!');
};
test();
Όπως ήδη γνωρίζετε, δεν μπορούμε να προσπελάσουμε τη συνάρτηση μέσω αυτού του ονόματος:
let test = function func() {
console.log('!');
};
test(); // θα εμφανίσει '!'
func(); // θα εμφανίσει σφάλμα
Γιατί λοιπόν να δώσουμε όνομα στη συνάρτηση αν δεν θα είναι προσβάσιμο; Το θέμα είναι ότι αυτό το όνομα δεν θα είναι προσβάσιμο από έξω από τη συνάρτηση, αλλά είναι προσβάσιμο μέσα σε αυτή τη συνάρτηση.
Ας το ελέγξουμε:
let test = function func() {
console.log(func); // η συνάρτηση θα εμφανίσει τον δικό της πηγαίο κώδικα
};
test(); // καλούμε τη συνάρτηση
Ας καλέσουμε τη συνάρτησή μας μέσα στον εαυτό της:
let test = function func() {
console.log('!'); // εμφανίζουμε '!'
func(); // καλούμε τον εαυτό μας
};
test();
Εάν εκτελέσετε αυτόν τον κώδικα, θα εμφανίζεται στον πίνακα ελέγχου ένας άπειρος αριθμός μηνυμάτων.
Στην πραγματικότητα, η συνάρτησή μας μπορεί να κληθεί
μέσα στον εαυτό της όχι μόνο ως func, αλλά
και ως test:
let test = function func() {
console.log('!');
test(); // καλούμε τον εαυτό μας
};
test();
Ποια είναι λοιπόν η διαφορά; Η διαφορά είναι ότι το όνομα
test - είναι απλώς μια μεταβλητή. Κατά τη διάρκεια
της εκτέλεσης του script η συνάρτησή μας μπορεί να αποθηκευτεί
σε άλλη μεταβλητή ή να περαστεί ως παράμετρος
- σε αυτή την περίπτωση η σύνδεση μεταξύ της μεταβλητής test
και της συνάρτησης μπορεί να χαθεί.
Το όνομα func είναι άρρηκτα συνδεδεμένο με τη συνάρτηση
ειδικά για να μπορούμε να προσπελάσουμε
τη συνάρτησή μας μέσα στον εαυτό της.
Τέτοιες Function Expression με όνομα συνάρτησης ονομάζονται ονοματοδοτημένες συναρτησιακές εκφράσεις.