Middle
Ποια είναι η διαφορά μεταξύ των βελών συναρτήσεων και των κανονικών συναρτήσεων όσον αφορά την ανάγκη χρήσης της μεθόδου bind;
sobes.tech AI
Απάντηση από AI
Οι βελάκια συναρτήσεις δεν έχουν δικό τους πλαίσιο this. Αποθηκεύουν το this από το περιβάλλον (λεξικό περιβάλλον).
Οι κανονικές συναρτήσεις ορίζουν το this τους ανάλογα με το πώς καλούνται:
- Στο παγκόσμιο πλαίσιο (
windowήglobal). - Ως μέθοδος ενός αντικειμένου (
thisδείχνει στο αντικείμενο). - Ως κατασκευαστής (
thisδείχνει στη νέα περίπτωση). - Χρησιμοποιώντας
call,applyήbind(thisορίζεται ρητά).
Επειδή οι βελάκια δεν έχουν δικό τους this, η κλήση bind σε μια βελάκι δεν έχει νόημα και δεν θα αλλάξει το this που έχει οριστεί λεξικά. Αν προσπαθήσετε να καλέσετε bind σε μια βελάκι, απλώς θα επιστραφεί η ίδια.
Παράδειγμα:
// Κανονική συνάρτηση
const normalFunc = function() {
console.log(this.name);
};
const obj1 = { name: 'Αντικείμενο 1', method: normalFunc };
const obj2 = { name: 'Αντικείμενο 2' };
obj1.method(); // Έξοδος: Αντικείμενο 1
const boundFunc = normalFunc.bind(obj2);
boundFunc(); // Έξοδος: Αντικείμενο 2 (το `this` άλλαξε με επιτυχία)
// Βελάκι
const arrowFunc = () => {
console.log(this.name);
};
const obj3 = { name: 'Αντικείμενο 3' };
// Το ArrowFunc αποθηκεύει το `this` από το περιβάλλον (σε αυτήν την περίπτωση, το παγκόσμιο αντικείμενο)
arrowFunc(); // Έξοδος: undefined (πιθανώς, επειδή το `this` δεν περιέχει `name`)
const boundArrowFunc = arrowFunc.bind(obj3);
boundArrowFunc(); // Έξοδος: undefined (`this` δεν άλλαξε, το bind δεν είχε αποτέλεσμα)
// Παράδειγμα με αποθήκευση του `this`
const person = {
name: 'Αλίκη',
greet: function() {
// Εδώ, το `this` δείχνει στο `person`
const greetLater = () => {
// Εδώ, το `this` αποθηκεύεται από το εξωτερικό πλαίσιο της `greet`, δηλαδή και πάλι στο `person`
console.log(`Γειά σου, ${this.name}!`);
};
greetLater();
}
};
person.greet(); // Έξοδος: Γειά σου, Αλίκη!
Συνοπτικά, η μέθοδος bind είναι απαραίτητη για τις κανονικές συναρτήσεις ώστε να ορίσουν ρητά το πλαίσιο this, ενώ για τις βελάκια είναι περιττή, καθώς το this τους καθορίζεται λεξικά και δεν μπορεί να αλλάξει με bind.