Sobes.tech
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.