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