Η “Strict Mode” (Αυστηρή Λειτουργία) στη JavaScript είναι ένας τρόπος εκτέλεσης του κώδικα με αυστηρότερους κανόνες και πιο αυστηρό χειρισμό των λαθών. Μπορεί να ενεργοποιηθεί προσθέτοντας τη φράση "use strict";
στην αρχή του JavaScript κώδικα.
Όταν η “Strict Mode” είναι ενεργοποιημένη, η JavaScript μηχανή εφαρμόζει τους παρακάτω κανόνες:
- Απαγορεύει τη χρήση μη δηλωμένων μεταβλητών.
- Απαγορεύει τη χρήση δεσμευμένων λέξεων ως ονομάτων μεταβλητών (π.χ.
let
,const
,var
, κλπ.). - Απαγορεύει την εκχώρηση τιμής σε μεταβλητές που έχουν δηλωθεί με
const
. - Απαγορεύει την εκχώρηση τιμής σε αντικείμενα και συμβολοσειρές που έχουν δηλωθεί ως “για ανάγνωση” (read-only) με το
Object.defineProperty
. - Απαγορεύει τη χρήση
this
στο “αδιέξοδο” (global) πεδίο, διότι στην αυστηρή λειτουργία τοthis
δεν αναφέρεται στο αντικείμενο window.
Η “Strict Mode” βοηθά στην αναγνώριση και πρόληψη σφαλμάτων στον κώδικα, βελτιώνει την απόδοση του προγράμματος και κάνει τον κώδικα πιο ασφαλή. Για να ενεργοποιήσετε την “Strict Mode”, απλά προσθέστε τη φράση "use strict";
στην αρχή του JavaScript αρχείου ή της συνάρτησης που θέλετε να την εφαρμόσετε.
Η “Strict Mode” δηλώνεται προσθέτοντας τη φράση "use strict";
στην αρχή ενός σεναρίου (script) ή μιας συνάρτησης.
Όταν δηλώνεται στην αρχή ενός σεναρίου (script), έχει παγκόσμιο πεδίο εφαρμογής (όλος ο κώδικας στο σενάριο θα εκτελεστεί σε αυστηρή λειτουργία).
Βεβαιωθείτε ότι έχετε ενεργοποιήσει την αυστηρή λειτουργία προσθέτοντας τη φράση "use strict";
στην αρχή του σεναρίου ή της συνάρτησης. Παρακάτω είναι μερικά παραδείγματα που χρησιμοποιούν την αυστηρή λειτουργία:
- Σενάριο με αυστηρή λειτουργία:
"use strict"; x = 10; // Προκαλεί σφάλμα, διότι η μεταβλητή x δεν έχει δηλωθεί console.log(x);
- Συνάρτηση με αυστηρή λειτουργία:
function strictModeExample() { "use strict"; y = 20; // Προκαλεί σφάλμα, διότι η μεταβλητή y δεν έχει δηλωθεί console.log(y); } strictModeExample();
- Πεδίο αντικειμένου με αυστηρή λειτουργία:
"use strict"; const myObject = { name: "John", age: 30 }; myObject.salary = 5000; // Προκαλεί σφάλμα, διότι η προσπέλαση του αντικειμένου είναι για ανάγνωση μόνο console.log(myObject.salary);
Αυτά τα παραδείγματα δείχνουν πώς μπορείτε να χρησιμοποιήσετε την αυστηρή λειτουργία για να ελέγξετε και να προλάβετε πιθανά σφάλματα στον κώδικά σας.
[adinserter block=”2″]
Η σύνταξη "use strict";
σχεδιάστηκε να είναι συμβατή με παλαιότερες εκδόσεις της JavaScript.
Η μεταγλώττιση ενός αριθμητικού λογικού (π.χ. 4 + 5;
) ή ενός αλφαριθμητικού (π.χ. "John Doe";
) σε ένα πρόγραμμα JavaScript δεν έχει παρενέργειες. Απλά μεταγλωττίζεται σε μια μη υπάρχουσα μεταβλητή και τερματίζεται.
Έτσι, το "use strict";
έχει σημασία μόνο για νέους μεταγλωττιστές που “κατανοούν” τη σημασία του. Αυτός ο τρόπος δηλώνει στον μεταγλωττιστή να εκτελέσει τον κώδικα σε αυστηρή λειτουργία, εφαρμόζοντας τους αυστηρότερους κανόνες ελέγχου σφαλμάτων.
Η αυστηρή λειτουργία (Strict Mode) διευκολύνει την εγγραφή “ασφαλούς” JavaScript κώδικα.
Η αυστηρή λειτουργία μετατρέπει προηγουμένως αποδεκτή “κακή σύνταξη” σε πραγματικά σφάλματα.
Για παράδειγμα, στην κανονική JavaScript, η κακή πληκτρολόγηση ενός ονόματος μεταβλητής δημιουργεί μια νέα παγκόσμια μεταβλητή. Στην αυστηρή λειτουργία, αυτό θα προκαλέσει ένα σφάλμα, καθιστώντας αδύνατο το να δημιουργήσετε κατά λάθος μια παγκόσμια μεταβλητή.
Στην κανονική JavaScript, ένας προγραμματιστής δεν θα λάβει καμία ενδεικτική πληροφορία για σφάλματα όταν αντιστοιχίζει τιμές σε μη εγγράψιμες ιδιότητες.
Στην αυστηρή λειτουργία, κάθε αντιστοίχιση σε μια μη εγγράψιμη ιδιότητα, σε μια ιδιότητα με μόνο getter, σε μια μη υπάρχουσα ιδιότητα, σε μια μη υπάρχουσα μεταβλητή ή σε ένα μη υπάρχον αντικείμενο, θα προκαλέσει ένα σφάλμα.
Στην αυστηρή λειτουργία, δεν επιτρέπεται να χρησιμοποιείτε μια μεταβλητή χωρίς να τη δηλώσετε πρώτα.
Ενα παράδειγμα που δείχνει τη διαφορά μεταξύ κανονικής λειτουργίας και αυστηρής λειτουργίας σχετικά με τη χρήση μιας μη δηλωμένης μεταβλητής:
// Κανονική λειτουργία - Μη δηλωμένη μεταβλητή x = 10; console.log(x); // Θα εμφανίσει: 10 // Αυστηρή λειτουργία - Μη δηλωμένη μεταβλητή "use strict"; y = 20; // Σφάλμα! Η μεταβλητή 'y' δεν έχει δηλωθεί
Στο παραπάνω παράδειγμα, στην κανονική λειτουργία, η μεταβλητή x
δεν δηλώνεται εξαρχής, αλλά μπορεί να χρησιμοποιηθεί χωρίς πρόβλημα. Στην αυστηρή λειτουργία, η μεταβλητή y
δεν έχει δηλωθεί και η προσπάθεια να της ανατεθεί μια τιμή προκαλεί σφάλμα.
Στην αυστηρή λειτουργία, δεν επιτρέπεται να χρησιμοποιείτε ένα αντικείμενο χωρίς να το δηλώσετε πρώτα:
// Αυστηρή λειτουργία - Αντικείμενο χωρίς δήλωση "use strict"; let person = { name: "John", age: 30 }; console.log(person.name); // Θα εμφανίσει: John
Στο παραπάνω παράδειγμα, το αντικείμενο person
δημιουργείται και χρησιμοποιείται χωρίς πρόβλημα. Στην αυστηρή λειτουργία, η χρήση αντικειμένων χωρίς προηγούμενη δήλωση δεν επιτρέπεται και θα προκαλέσει σφάλμα.
Στην αυστηρή λειτουργία, δεν επιτρέπεται να διαγράψετε μια μεταβλητή (ή αντικείμενο) με τη χρήση του delete
:
"use strict"; let x = 10; console.log(x); // Θα εμφανίσει: 10 delete x; // Σφάλμα! Δεν επιτρέπεται η διαγραφή της μεταβλητής 'x'
Στο παραπάνω παράδειγμα, η προσπάθεια διαγραφής της μεταβλητής x
με τη χρήση του delete
προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, δεν επιτρέπεται να διαγράψετε μια συνάρτηση με τη χρήση του delete
:
"use strict"; function sayHello() { console.log("Hello!"); } sayHello(); // Θα εμφανίσει: Hello! delete sayHello; // Σφάλμα! Δεν επιτρέπεται η διαγραφή της συνάρτησης 'sayHello'
Στο παραπάνω παράδειγμα, η προσπάθεια διαγραφής της συνάρτησης sayHello
με τη χρήση του delete
προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, δεν επιτρέπεται να δηλώσετε παραμέτρους με το ίδιο όνομα σε μια συνάρτηση:
"use strict"; function sum(a, b, a) { return a + b + a; // Σφάλμα! Το όνομα 'a' χρησιμοποιείται δύο φορές } console.log(sum(1, 2, 3)); // Δεν θα φτάσουμε εδώ λόγω σφάλματος
Στο παραπάνω παράδειγμα, η προσπάθεια να δηλωθεί η παράμετρος a
δύο φορές προκαλεί σφάλμα στην αυστηρή λειτουργία.
[adinserter block=”3″]
Στην αυστηρή λειτουργία, δεν επιτρέπεται η χρήση οκταδικών αριθμητικών λογικών στη γραφή με το πρόθεμα “0o”:
"use strict"; let octalNumber = 0o10; // Σφάλμα! Οκταδική γραφή δεν επιτρέπεται console.log(octalNumber);
Στο παραπάνω παράδειγμα, η προσπάθεια να χρησιμοποιηθεί οκταδική γραφή με το πρόθεμα “0o” προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, οι οκταδικοί αποδραστικοί χαρακτήρες δεν επιτρέπονται:
"use strict"; let octalEscape = "1"; // Σφάλμα! Οκταδικοί αποδραστικοί χαρακτήρες δεν επιτρέπονται console.log(octalEscape);
Στο παραπάνω παράδειγμα, η προσπάθεια να χρησιμοποιηθεί οκταδικός αποδραστικός χαρακτήρας προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, δεν επιτρέπεται η εγγραφή σε ιδιότητες που έχουν οριστεί ως μόνο για ανάγνωση (read-only):
"use strict"; const readOnlyProperty = 42; readOnlyProperty = 50; // Σφάλμα! Εγγραφή σε ιδιότητα μόνο για ανάγνωση δεν επιτρέπεται console.log(readOnlyProperty);
Στο παραπάνω παράδειγμα, η προσπάθεια να γίνει εγγραφή στη μεταβλητή readOnlyProperty
, που έχει δηλωθεί ως σταθερά (const), προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, δεν επιτρέπεται η εγγραφή σε ιδιότητες που έχουν οριστεί ως μόνο για ανάγνωση (get-only):
"use strict"; const obj = { get readOnlyProperty() { return 42; } }; obj.readOnlyProperty = 50; // Σφάλμα! Εγγραφή σε ιδιότητα μόνο για ανάγνωση δεν επιτρέπεται console.log(obj.readOnlyProperty);
Στο παραπάνω παράδειγμα, η προσπάθεια να γίνει εγγραφή στην ιδιότητα readOnlyProperty
, που έχει οριστεί ως μόνο για ανάγνωση με τη χρήση της μεθόδου get
, προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, δεν επιτρέπεται η διαγραφή μιας ιδιότητας που δεν μπορεί να διαγραφεί (undeletable):
"use strict"; const obj = {}; Object.defineProperty(obj, "undeletableProperty", { value: 42, configurable: false // Η ιδιότητα δεν μπορεί να διαγραφεί }); delete obj.undeletableProperty; // Σφάλμα! Διαγραφή μη διαγράψιμης ιδιότητας δεν επιτρέπεται console.log(obj.undeletableProperty);
Στο παραπάνω παράδειγμα, η προσπάθεια διαγραφής της ιδιότητας undeletableProperty
, που έχει καθοριστεί ως μη διαγράψιμη με τη χρήση της μεθόδου Object.defineProperty()
, προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, η λέξη “eval” δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή:
"use strict"; let eval = 42; // Σφάλμα! Η λέξη "eval" δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή console.log(eval);
Στο παραπάνω παράδειγμα, η προσπάθεια να δηλωθεί η μεταβλητή eval
προκαλεί σφάλμα στην αυστηρή λειτουργία.
Στην αυστηρή λειτουργία, η λέξη “arguments” δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή:
"use strict"; let arguments = [1, 2, 3]; // Σφάλμα! Η λέξη "arguments" δεν μπορεί να χρησιμοποιηθεί ως μεταβλητή console.log(arguments);
Στο παραπάνω παράδειγμα, η προσπάθεια να δηλωθεί η μεταβλητή arguments
προκαλεί σφάλμα στην αυστηρή λειτουργία.
[adinserter block=”4″]
Στην αυστηρή λειτουργία, η χρήση της δήλωσης with
δεν επιτρέπεται:
"use strict"; with (Math) { let x = cos(2); // Σφάλμα! Η δήλωση with δεν επιτρέπεται } console.log(x);
Στο παραπάνω παράδειγμα, η προσπάθεια χρήσης της δήλωσης with
προκαλεί σφάλμα στην αυστηρή λειτουργία.
Για λόγους ασφαλείας, η συνάρτηση eval()
δεν επιτρέπεται να δημιουργεί μεταβλητές στο πεδίο εφαρμογής από το οποίο κλήθηκε:
"use strict"; function createVariable() { eval("let x = 10;"); // Σφάλμα! Η συνάρτηση eval δεν επιτρέπεται να δημιουργεί μεταβλητές στο πεδίο εφαρμογής της κλήσης } createVariable(); console.log(x); // Σφάλμα! Η μεταβλητή x δεν έχει δημιουργηθεί
Στο παραπάνω παράδειγμα, η προσπάθεια δημιουργίας μεταβλητής μέσω της συνάρτησης eval()
προκαλεί σφάλμα, καθώς δεν επιτρέπεται να δημιουργεί μεταβλητές στο πεδίο εφαρμογής από το οποίο κλήθηκε.