Sobes.tech
Middle

Μίλησε για το πλαίσιο των συναρτήσεων στη JavaScript.

sobes.tech AI

Απάντηση από AI

Το πλαίσιο εκτέλεσης μιας συνάρτησης (this) στη JavaScript καθορίζει πώς καλείται η συνάρτηση και ποιες τιμές είναι διαθέσιμες μέσα σε αυτήν. Το πλαίσιο αλλάζει δυναμικά ανάλογα με τον τρόπο κλήσης:

  • Παγκόσμιο πλαίσιο: Εκτός συναρτήσεων, το this αναφέρεται στο παγκόσμιο αντικείμενο (window στον browser, global στο Node.js).
    // Στον browser
    console.log(this === window); // true
    
    // Στο Node.js
    console.log(this === global); // true
    
  • Πλαίσιο συνάρτησης:
    • Τυπική κλήση: Σε μη αυστηρή λειτουργία, το this μέσα σε μια συνάρτηση αναφέρεται στο παγκόσμιο αντικείμενο (αν η συνάρτηση δεν είναι μέθοδος ενός αντικειμένου). Σε αυστηρή λειτουργία ("use strict";), το this θα είναι undefined.
      function showThis() {
        console.log(this);
      }
      
      showThis(); // Σε μη αυστηρή λειτουργία: Παγκόσμιο αντικείμενο; Σε αυστηρή: undefined
      
    • Κλήση ως μέθοδος αντικειμένου: Το this αναφέρεται στο αντικείμενο στο οποίο ανήκει η μέθοδος.
      const user = {
        name: 'Alice',
        greet: function() {
          console.log("Γειά σου, το όνομά μου είναι " + this.name);
        }
      };
      
      user.greet(); // Γειά σου, το όνομά μου είναι Alice
      
    • Με new (κατασκευαστής): Δημιουργεί ένα νέο αντικείμενο, το οποίο γίνεται η τιμή του this μέσα στη συναρτησιακή κατασκευαστική, και επιστρέφει αυτό το αντικείμενο.
      function Person(name) {
        this.name = name;
      }
      
      const person1 = new Person('Bob');
      console.log(person1.name); // Bob
      
    • Ρητή καθοδήγηση πλαισίου (call, apply, bind):
      • call(thisArg, arg1, arg2, ...): Καλεί τη συνάρτηση με το καθορισμένο this και τα επιχειρήματα που αναφέρονται ξεχωριστά.
      • apply(thisArg, [argsArray]): Καλεί τη συνάρτηση με το καθορισμένο this και τα επιχειρήματα σε μορφή πίνακα.
      • bind(thisArg, arg1, arg2, ...): Επιστρέφει μια νέα συνάρτηση με το this δεμένο μόνιμα στο thisArg και με τα επιχειρήματα προ-δεμένα.
      function introduce(greeting, punctuation) {
        console.log(greeting + ", εγώ είμαι " + this.name + punctuation);
      }
      
      const person = { name: 'Charlie' };
      
      introduce.call(person, "Γειά σου", "!");  // Γειά σου, εγώ είμαι Charlie!
      introduce.apply(person, ["Γεια", "."]); // Γειά σου, εγώ είμαι Charlie.
      
      const boundIntroduce = introduce.bind(person, "Γεια");
      boundIntroduce("?"); // Γειά, εγώ είμαι Charlie?
      
  • Βέλος συναρτήσεις: Δεν έχουν δικό τους πλαίσιο this. Συλλέγουν το this από το λεξικό πλαίσιο στο οποίο ορίζονται.
    const obj = {
      name: 'David',
      sayLater: function() {
        // το `this` εδώ αναφέρεται στο `obj`
        setTimeout(() => {
          // το `this` εδώ επίσης αναφέρεται στο `obj` (κληρονομημένο από το `sayLater`)
          console.log("Αργότερα, είμαι " + this.name);
        }, 1000);
      }
    };
    
    obj.sayLater(); // Αργότερα, είμαι David