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