Προγραμματισμός

10 έννοιες JavaScript κάθε προγραμματιστής Node.js πρέπει να κυριαρχήσει

Ο Rahul Mhatre είναι επικεφαλής της ομάδας προγραμματιστών της Software AG.

Με το JavaScript και τον κινητήρα V8 στον πυρήνα, αρχιτεκτονική που βασίζεται σε εκδηλώσεις και επεκτασιμότητα, το Node.js έχει γίνει γρήγορα το de facto πρότυπο για τη δημιουργία εφαρμογών Ιστού και προϊόντων SaaS. Πλαίσια Node.js όπως Express, Sails και Socket.IO επιτρέπουν στους χρήστες να κάνουν γρήγορη εκκίνηση εφαρμογών και να επικεντρώνονται μόνο στην επιχειρηματική λογική.

Το Node.js οφείλει πολλά στη JavaScript για την τεράστια δημοτικότητά του. Το JavaScript είναι μια πολυπαρασκευαστική γλώσσα που υποστηρίζει πολλά διαφορετικά στυλ προγραμματισμού, όπως λειτουργικό προγραμματισμό, διαδικαστικό προγραμματισμό και αντικειμενοστραφή προγραμματισμό. Επιτρέπει στον προγραμματιστή να είναι ευέλικτος και να εκμεταλλεύεται τα διάφορα στυλ προγραμματισμού.

Αλλά η JavaScript μπορεί να είναι ένα δίκοπο σπαθί. Η φύση του πολλαπλού παραδείγματος της JavaScript σημαίνει ότι σχεδόν όλα είναι μεταβλητά. Επομένως, δεν μπορείτε να παραβλέψετε την πιθανότητα μετάλλαξης αντικειμένου και πεδίου κατά τη σύνταξη κώδικα Node.js. Επειδή η JavaScript δεν διαθέτει βελτιστοποίηση ουράς κλήσεων (η οποία επιτρέπει σε επαναλαμβανόμενες συναρτήσεις να επαναχρησιμοποιήσουν τα πλαίσια στοίβας για αναδρομικές κλήσεις), είναι επικίνδυνο να χρησιμοποιήσετε αναδρομή για μεγάλες επαναλήψεις. Εκτός από τις παγίδες όπως αυτές, το Node.js είναι μονό νήμα, επομένως είναι απαραίτητο για τους προγραμματιστές να γράφουν ασύγχρονο κώδικα.

Το JavaScript μπορεί να είναι ευεργετικό εάν χρησιμοποιείται με προσοχή - ή ωφέλιμο εάν είστε απερίσκεπτοι. Ακολουθώντας δομημένους κανόνες, μοτίβα σχεδιασμού, βασικές έννοιες και βασικούς κανόνες, θα σας βοηθήσουν να επιλέξετε τη βέλτιστη προσέγγιση σε ένα πρόβλημα. Ποιες βασικές έννοιες πρέπει να κατανοήσουν οι προγραμματιστές του Node.js; Παρακάτω θα μοιραστώ τις 10 έννοιες JavaScript που πιστεύω ότι είναι πιο σημαντικές για τη σύνταξη αποτελεσματικού και επεκτάσιμου κώδικα Node.js.

Σχετικό βίντεο: Συμβουλές και κόλπα Node.js

Σε αυτό το εξηγητικό βίντεο, μάθετε διάφορες τεχνικές που μπορούν να βελτιώσουν την εμπειρία ανάπτυξης του κόμβου σας.

JavaScript IIFE: Επικαλέστηκε αμέσως εκφράσεις συνάρτησης

Μια έκφραση συνάρτησης που επικαλέστηκε αμέσως (IIFE) είναι μια συνάρτηση που εκτελείται μόλις δημιουργηθεί. Δεν έχει καμία σχέση με γεγονότα ή ασύγχρονη εκτέλεση. Μπορείτε να ορίσετε ένα IIFE όπως φαίνεται παρακάτω:

(λειτουργία() {

// όλος ο κωδικός σας εδώ

// ...

})();

Το πρώτο ζεύγος παρενθέσεων λειτουργία(){...} μετατρέπει τον κώδικα μέσα στις παρενθέσεις σε μια έκφραση. Το δεύτερο ζεύγος παρενθέσεων καλεί τη συνάρτηση που προκύπτει από την έκφραση. Ένα IIFE μπορεί επίσης να περιγραφεί ως ανώνυμη συνάρτηση αυτο-επίκλησης. Η συνηθέστερη χρήση του είναι να περιορίσει το εύρος μιας μεταβλητής που γίνεται μέσω var ή να ενθυλακώσει το πλαίσιο για να αποφευχθούν συγκρούσεις ονόματος.

Κλείσιμο JavaScript

Ένα κλείσιμο σε JavaScript είναι μια εσωτερική λειτουργία που έχει πρόσβαση στο πεδίο της εξωτερικής της λειτουργίας, ακόμη και μετά την επιστροφή της εξωτερικής λειτουργίας. Ένα κλείσιμο καθιστά τις μεταβλητές της εσωτερικής λειτουργίας ιδιωτικές. Ένα απλό παράδειγμα κλεισίματος φαίνεται παρακάτω:

var count = (συνάρτηση () {

var _counter = 0;

συνάρτηση επιστροφής () {return _counter + = 1;}

})();

μετρώ();

μετρώ();

μετρώ();

> // ο μετρητής είναι τώρα 3

Η μεταβλητή μετρώ εκχωρείται μια εξωτερική συνάρτηση. Η εξωτερική λειτουργία εκτελείται μόνο μία φορά, η οποία θέτει τον μετρητή στο μηδέν και επιστρέφει μια εσωτερική λειτουργία. ο _μετρητής Η μεταβλητή μπορεί να προσεγγιστεί μόνο από την εσωτερική λειτουργία, η οποία την κάνει να συμπεριφέρεται σαν ιδιωτική μεταβλητή.

Πρωτότυπα JavaScript

Κάθε συνάρτηση JavaScript έχει μια πρωτότυπη ιδιότητα που χρησιμοποιείται για την επισύναψη ιδιοτήτων και μεθόδων. Αυτή η ιδιότητα δεν είναι μετρήσιμη. Επιτρέπει στον προγραμματιστή να επισυνάψει μεθόδους ή συναρτήσεις μελών στα αντικείμενά του. Το JavaScript υποστηρίζει την κληρονομιά μόνο μέσω του πρωτοτύπου ιδιοτήτων. Σε περίπτωση κληρονομικού αντικειμένου, η πρωτότυπη ιδιότητα δείχνει τον γονέα του αντικειμένου. Μια κοινή προσέγγιση για να επισυνάψετε μεθόδους σε μια συνάρτηση είναι να χρησιμοποιήσετε πρωτότυπα όπως φαίνεται παρακάτω:

Λειτουργία ορθογώνιο (x, y) {

αυτό._ μήκος = x;

αυτό._breadth = y;

}

Rectangle.prototype.getDimensions = συνάρτηση () {

επιστροφή {length: this._length, πλάτος: this._breadth};

};

Rectangle.prototype.setDimensions = συνάρτηση (len, bred) {

αυτό._ μήκος = len;

αυτό._breadth = αναπαράγεται;

};

Ιδιωτικές ιδιότητες JavaScript, χρησιμοποιώντας κλεισίματα

Το JavaScript σας επιτρέπει να ορίσετε ιδιωτικές ιδιότητες χρησιμοποιώντας το πρόθεμα υπογράμμισης όπως φαίνεται στο παραπάνω παράδειγμα. Ωστόσο, αυτό δεν εμποδίζει έναν χρήστη να έχει άμεση πρόσβαση ή να τροποποιήσει μια ιδιότητα που υποτίθεται ότι είναι ιδιωτική.

Ο ορισμός ιδιωτικών ιδιοτήτων με χρήση κλεισίματος θα σας βοηθήσει να λύσετε αυτό το πρόβλημα. Οι συναρτήσεις μέλους που χρειάζονται πρόσβαση σε ιδιωτικές ιδιότητες πρέπει να καθοριστούν στο ίδιο το αντικείμενο. Μπορείτε να κάνετε ιδιωτικές ιδιοκτησίες χρησιμοποιώντας κλεισίματα όπως φαίνεται παρακάτω:

Λειτουργία ορθογώνιο (_length, _breadth) {

this.getDimensions = συνάρτηση () {

επιστροφή {length: _length, πλάτος: _breadth};

     };

this.setDimension = συνάρτηση (len, bred) {

_length = len;

_breadth = αναπαράγεται

    };

}

Πρότυπο μονάδας JavaScript

Το μοτίβο Module είναι το πιο συχνά χρησιμοποιούμενο μοτίβο σχεδίασης σε JavaScript για την επίτευξη χαλαρά συνδεδεμένου, καλά δομημένου κώδικα. Σας επιτρέπει να δημιουργήσετε δημόσια και ιδιωτικά επίπεδα πρόσβασης. Ένας τρόπος για να επιτύχετε ένα μοτίβο ενότητας παρουσιάζεται παρακάτω:

var Direction = (συνάρτηση () {

var _direction = 'προς τα εμπρός'

var changeDirection = συνάρτηση (d) {

_κατεύθυνση = d;

  }

επιστροφή {setDirection: function (d) {

changeDirection (δ);

console.log (_direction);

          }

  };

})();

Direction.setDirection («πίσω»); // Έξοδοι: «πίσω»

console.log (Direction._direction);

Το μοτίβο Revealing Module είναι παρόμοιο με το μοτίβο Module όπου οι μεταβλητές και οι μέθοδοι που πρέπει να εκτεθούν επιστρέφονται σε ένα κυριολεκτικό αντικείμενο. Το παραπάνω παράδειγμα μπορεί να γραφτεί χρησιμοποιώντας το μοτίβο Revealing Module ως εξής:

var Direction = (συνάρτηση () {

var _direction = 'προς τα εμπρός';

var _privateChangeDirection = συνάρτηση (d) {

_κατεύθυνση = d;

  }

ΕΠΙΣΤΡΟΦΗ {

setDirection: _privateChangeDirection

  };

})();

Ανύψωση JavaScript

Το JavaScript μετακινεί μεταβλητές και δηλώσεις συναρτήσεων στην κορυφή του πεδίου εφαρμογής τους πριν από την εκτέλεση κώδικα. Αυτό ονομάζεται ανύψωση. Ανεξάρτητα από το πού τοποθετείτε τη δήλωση συναρτήσεων και μεταβλητών στον κώδικά σας, μεταφέρονται στην κορυφή του πεδίου εφαρμογής τους από τον διερμηνέα. Αυτό μπορεί ή όχι να είναι εκεί που τα θέλετε. Εάν όχι, τότε το πρόγραμμά σας θα έχει σφάλματα.

Οι μεταβλητές δηλώσεις υποβάλλονται σε επεξεργασία προτού εκτελεστεί οποιοσδήποτε κώδικας. Κατά ειρωνικό τρόπο, οι αδήλωτες μεταβλητές δεν υπάρχουν έως ότου τους δοθεί μια τιμή. Αυτό προκαλεί όλες τις αδήλωτες μεταβλητές να γίνουν καθολικές μεταβλητές. Αν και οι δηλώσεις συνάρτησης ανυψώνονται, οι εκφράσεις συνάρτησης δεν ανυψώνονται. Το JavaScript έχει μια σειρά προτεραιότητας κατά την ανύψωση μεταβλητών και λειτουργιών.

Η προτεραιότητα δίνεται παρακάτω από υψηλότερο σε χαμηλότερο:

  • Μεταβλητή ανάθεση
  • Δήλωση λειτουργίας
  • Μεταβλητές δηλώσεις

Για να αποφύγετε σφάλματα, πρέπει να δηλώσετε τις μεταβλητές και τις λειτουργίες σας στην αρχή κάθε πεδίου.

JavaScript

Το Currying είναι μια μέθοδος για να κάνετε τις λειτουργίες πιο ευέλικτες. Με μια συνάρτηση curried, μπορείτε να περάσετε όλα τα ορίσματα που η συνάρτηση περιμένει και να λάβετε το αποτέλεσμα, ή μπορείτε να περάσετε μόνο ένα υποσύνολο ορισμάτων και να λάβετε μια συνάρτηση που περιμένει τα υπόλοιπα ορίσματα. Ένα απλό παράδειγμα κάρι δίνεται παρακάτω:

var myFirstCurry = συνάρτηση (λέξη) {

λειτουργία επιστροφής (χρήστης) {

επιστροφή [word, ",", user] .join ("");

  };

};

var HelloUser = myFirstCurry ("Γεια σας");

Γεια σας ("Rahul"); // Έξοδος: "Γεια σου, Rahul"

Η αρχική συνάρτηση μπορεί να κληθεί απευθείας περνώντας κάθε μία από τις παραμέτρους σε ένα ξεχωριστό σύνολο παρενθέσεων, το ένα μετά το άλλο, όπως φαίνεται παρακάτω

myFirstCurry ("Hey, wassup!") ("Rahul"); // Έξοδος: "Hey, wassup !, Rahul"

Εφαρμογή JavaScript, μέθοδος κλήσης και δέσμευσης

Είναι επιτακτική ανάγκη για κάθε προγραμματιστή JavaScript να κατανοήσει τη διαφορά μεταξύ του κλήση, ισχύουν, και δένω μεθόδους. Οι τρεις συναρτήσεις είναι παρόμοιες στο ότι το πρώτο τους επιχείρημα είναι πάντα η τιμή "αυτό" ή το πλαίσιο, στο οποίο θέλετε να δώσετε τη συνάρτηση στην οποία καλείτε τη μέθοδο.

Από τους τρεις, κλήση είναι το πιο εύκολο. Είναι το ίδιο με την επίκληση μιας συνάρτησης, ενώ καθορίζει το περιβάλλον της. Ακολουθεί ένα παράδειγμα:

var χρήστης = {

όνομα: "Rahul Mhatre",

whatIsYourName: συνάρτηση () {

console.log (αυτό το όνομα);

     }

};

user.whatIsYourName (); // Έξοδος: "Rahul Mhatre",

var user2 = {

Όνομα: "Neha Sampat"

};

user.whatIsYourName.call (user2); // Έξοδος: "Neha Sampat"

Σημειώστε ότι ισχύουν είναι σχεδόν το ίδιο με κλήση. Η μόνη διαφορά είναι ότι περνάτε ορίσματα ως πίνακας και όχι ξεχωριστά. Οι πίνακες είναι ευκολότεροι στον χειρισμό σε JavaScript, ανοίγοντας μεγαλύτερο αριθμό δυνατοτήτων εργασίας με λειτουργίες. Εδώ είναι ένα παράδειγμα χρήσης ισχύουν και κλήση:

var χρήστης = {

χαιρετώ: "Γεια!",

SalamUser: function (όνομα χρήστη) {

console.log (this.greet + "" + userName);

     }

};

var χαιρετισμός1 = {

χαιρετώ: "Χόλα"

};

user.greetUser.call (χαιρετισμός1, "Rahul") // Έξοδος: "Hola Rahul"

user.greetUser.apply (χαιρετισμός1, ["Rahul"]) // Έξοδος: "Hola Rahul"

ο δένω Η μέθοδος σάς επιτρέπει να μεταβιβάσετε ορίσματα σε μια συνάρτηση χωρίς να την επικαλέσετε. Επιστρέφεται μια νέα συνάρτηση με ορίσματα που οριοθετούνται πριν από οποιαδήποτε περαιτέρω επιχειρήματα. Εδώ είναι ένα παράδειγμα:

var χρήστης = {

χαιρετώ: "Γεια!",

SalamUser: function (όνομα χρήστη) {

console.log (this.greet + "" + userName);

}

};

var SalamHola = user.greetUser.bind ({χαιρετισμός: "Hola"});

var SalamBonjour = user.greetUser.bind ({χαιρετισμός: "Bonjour"});

SalamHola ("Rahul") // Έξοδος: "Hola Rahul"

SalamBonjour ("Rahul") // Έξοδος: "Bonjour Rahul"

Απομνημόνευση JavaScript

Η απομνημόνευση είναι μια τεχνική βελτιστοποίησης που επιταχύνει την εκτέλεση της λειτουργίας αποθηκεύοντας αποτελέσματα ακριβών λειτουργιών και επιστρέφοντας τα προσωρινά αποθηκευμένα αποτελέσματα όταν εμφανιστεί ξανά το ίδιο σύνολο εισόδων. Τα αντικείμενα JavaScript συμπεριφέρονται σαν συσχετισμένοι πίνακες, καθιστώντας εύκολη την εφαρμογή απομνημονεύσεων σε JavaScript. Για παράδειγμα, μπορούμε να μετατρέψουμε μια αναδρομική συντελεστή συντελεστή σε μια απομνημονευμένη συνθετική συνάρτηση όπως φαίνεται παρακάτω:

function memoizeFunction (func) {

var cache = {};

συνάρτηση επιστροφής () {

var key = ορίσματα [0];

εάν (προσωρινή μνήμη [κλειδί]) {

επιστροφή κρυφής μνήμης [κλειδί];

          }

αλλιώς {

var val = func.apply (αυτό, επιχειρήματα);

προσωρινή μνήμη [κλειδί] = val;

επιστροφή val;

          }

  };

}

var fibonacci = memoizeFunction (συνάρτηση (n)

επιστροφή (n === 0);

Υπερφόρτωση μεθόδου JavaScript

Η μέθοδος υπερφόρτωσης επιτρέπει σε πολλές μεθόδους να έχουν το ίδιο όνομα αλλά διαφορετικά ορίσματα. Ο μεταγλωττιστής ή ο διερμηνέας καθορίζει ποια συνάρτηση θα καλέσει με βάση τον αριθμό των ορισμάτων που έχουν περάσει. Η μέθοδος υπερφόρτωσης δεν υποστηρίζεται απευθείας στο JavaScript. Αλλά μπορείτε να πετύχετε κάτι σαν αυτό όπως φαίνεται παρακάτω:

function overloadMethod (αντικείμενο, όνομα, fn) {

αν (! object._overload) {

object._overload = {};

     }

αν (! object._overload [όνομα]) {

object._overload [όνομα] = {};

    }

εάν (! object._overload [name] [fn.length]) {

object._overload [όνομα] [fn.length] = fn;

    }

αντικείμενο [όνομα] = συνάρτηση () {

εάν (this._overload [name] [argument.length])

επιστρέψτε αυτό._overload [name] [argument.length] .apply (this, επιχειρήματα);

     };

μαθητές λειτουργίας () {

overloadMethod (αυτό, "εύρεση", συνάρτηση () {

// Βρείτε έναν μαθητή με το όνομα

  });

overloadMethod (αυτό, "εύρεση", συνάρτηση (πρώτη, τελευταία) {

// Βρείτε έναν μαθητή με όνομα και επώνυμο

  });

}

var students = νέοι μαθητές ();

students.find (); // Βρίσκει όλα

students.find ("Rahul") · // Βρίσκει μαθητές με το όνομα

students.find ("Rahul", "Mhatre"); // Βρίσκει χρήστες με το όνομα και το επίθετο

Καθώς εξοικειωθείτε με το Node.js, θα παρατηρήσετε ότι υπάρχουν πολλοί τρόποι επίλυσης σχεδόν κάθε προβλήματος. Αλλά η σωστή προσέγγιση είναι κρίσιμη. Μια λανθασμένη προσέγγιση θα έχει ως αποτέλεσμα πολλές ανεπιθύμητες ενέργειες, όπως σπασμένα ή buggy εφαρμογές ή παλινδρόμηση που σας αναγκάζουν να ξαναγράψετε όλη τη λογική. Από την άλλη πλευρά, η σωστή προσέγγιση θα θέσει τα θεμέλια για μια στιβαρή, αποτελεσματική και επεκτάσιμη εφαρμογή.

Οι 10 έννοιες JavaScript που περιγράφονται σε αυτό το άρθρο είναι βασικά που πρέπει να γνωρίζει κάθε προγραμματιστής του Node.js. Αλλά είναι η κορυφή του παγόβουνου. Το JavaScript είναι ισχυρό και περίπλοκο. Όσο περισσότερο το χρησιμοποιείτε, τόσο περισσότερο θα καταλάβετε πόσο μεγάλη είναι η JavaScript. Η καλύτερη κατανόηση μιας τόσο εκτεταμένης γλώσσας σίγουρα θα σας βοηθήσει να αποφύγετε λάθη. Εν τω μεταξύ, πάρτε τα βασικά σωστά και θα δείτε εξαιρετικά αποτελέσματα.

Ο Rahul Mhatre είναι επικεφαλής της ομάδας προγραμματιστών της Software AG. Προηγουμένως ήταν τεχνικός αρχιτέκτονας στο Built.io, το οποίο αποκτήθηκε από την Software AG.

Το New Tech Forum παρέχει έναν χώρο για να εξερευνήσετε και να συζητήσετε την αναδυόμενη τεχνολογία σε πρωτοφανές βάθος και εύρος. Η επιλογή είναι υποκειμενική, με βάση την επιλογή των τεχνολογιών που πιστεύουμε ότι είναι σημαντικές και έχουν μεγάλο ενδιαφέρον για τους αναγνώστες. δεν αποδέχεται ασφάλεια μάρκετινγκ για δημοσίευση και διατηρεί το δικαίωμα να επεξεργαστεί όλο το περιεχόμενο. Στείλτε όλες τις ερωτήσεις στο [email protected].

$config[zx-auto] not found$config[zx-overlay] not found