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

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

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

Τι είναι το Currying;

Το Currying πήρε το όνομά του από τον μαθηματικό Haskell B. Curry, και η έννοια προέρχεται από τον λογισμό Λάμδα. Το Currying παίρνει μια συνάρτηση που λαμβάνει περισσότερες από μία παραμέτρους και τη χωρίζει σε μια σειρά από μοναδιαίες συναρτήσεις (μιας παραμέτρου). Με άλλα λόγια, μια curried συνάρτηση παίρνει μόνο μία παράμετρο τη φορά.

instagram viewer

Ένα βασικό παράδειγμα Currying

Παρακάτω είναι ένα παράδειγμα μιας συνάρτησης κουρδισμένης:

functionbuildSandwich(ingredient1) {
return(ingredient2) => {
return(ingredient3) => {
return`${ingredient1},${ingredient2},${ingredient3}`
}
}
}

ο buildSandwich() η συνάρτηση επιστρέφει μια άλλη συνάρτηση — μια ανώνυμη συνάρτηση που λαμβάνει το συστατικό 2 διαφωνία. Στη συνέχεια, αυτή η ανώνυμη συνάρτηση επιστρέφει μια άλλη ανώνυμη συνάρτηση που λαμβάνει συστατικό 3. Τέλος, αυτή η τελευταία συνάρτηση επιστρέφει το πρότυπο κυριολεκτικά, έναν τρόπο μορφοποίηση συμβολοσειρών σε JavaScript.

Αυτό που δημιουργήσατε είναι μια ένθετη συνάρτηση όπου κάθε συνάρτηση καλεί αυτήν που βρίσκεται κάτω από αυτήν μέχρι να φτάσουμε στο τέλος. Τώρα, όταν τηλεφωνείς buildSandwich() και περάστε της μια παράμετρο, θα επιστρέψει το τμήμα της συνάρτησης της οποίας τα ορίσματα δεν έχετε δώσει ακόμη:

console.log(buildSandwich("Bacon"))

Μπορείτε να δείτε από την έξοδο ότι το buildSandwich επιστρέφει μια συνάρτηση:

Για να ολοκληρώσετε την κλήση συνάρτησης, θα χρειαστεί να δώσετε και τα τρία ορίσματα:

buildSandwich("Bacon")("Lettuce")("Tomato")

Αυτός ο κωδικός μεταβιβάζει το "Bacon" στην πρώτη συνάρτηση, το "Lettuce" στη δεύτερη και το "Tomato" στην τελευταία συνάρτηση. Με άλλα λόγια, το buildSandwich() Η συνάρτηση χωρίζεται πραγματικά σε τρεις συναρτήσεις, με κάθε συνάρτηση να λαμβάνει μόνο μία παράμετρο.

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

const buildMeal = ingred1 =>ingred2 =>ingred3 =>
`${ingred1}, ${ingred2}. ${ingred3}`;

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

buildMeal("Bacon")("Lettuce")("Tomato")

Μερικώς εφαρμοσμένες συναρτήσεις Curry

Οι μερικώς εφαρμοσμένες συναρτήσεις είναι μια κοινή χρήση του currying. Αυτή η τεχνική συνεπάγεται την παροχή μόνο των απαραίτητων ορισμάτων κάθε φορά (και όχι την παροχή όλων των ορισμών). Κάθε φορά που καλείτε μια συνάρτηση περνώντας όλες τις απαιτούμενες παραμέτρους, λέτε ότι έχετε "εφαρμόσει" αυτήν τη συνάρτηση.

Ας δούμε ένα παράδειγμα:

const multiply = (x, y) => x * y;

Παρακάτω είναι η curried έκδοση του πολλαπλασιασμού:

const curriedMultiply = x =>y => x * y;

ο curriedMultiply() η συνάρτηση λαμβάνει το Χ όρισμα για την πρώτη συνάρτηση και y για τη δεύτερη συνάρτηση, τότε πολλαπλασιάζει και τις δύο τιμές.

Για να δημιουργήσετε την πρώτη μερικώς εφαρμοσμένη συνάρτηση, καλέστε curriedMultiple() με την πρώτη παράμετρο και αντιστοιχίστε την επιστρεφόμενη συνάρτηση σε μια μεταβλητή:

const timesTen = curriedMultiply(10)

Σε αυτό το σημείο, ο κώδικας έχει «εφαρμόσει εν μέρει» το curriedMultiply() λειτουργία. Οπότε όποτε θέλετε καλέστε timesTen(), Απλώς πρέπει να περάσετε έναν αριθμό και ο αριθμός θα πολλαπλασιαστεί αυτόματα με το 10 (το οποίο αποθηκεύεται στην εφαρμοζόμενη συνάρτηση):

console.log(timesTen(8)) // 80

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

Ρίξτε μια ματιά σε ένα παράδειγμα που είναι πιο κοντά σε μια πραγματική περίπτωση χρήσης ανάπτυξης ιστού. Παρακάτω έχετε ένα updateElemText() συνάρτηση που παίρνει ένα στοιχείο ταυτότητα στην πρώτη κλήση, το περιεχόμενο στη δεύτερη κλήση και, στη συνέχεια, ενημερώνει το στοιχείο με βάση το ταυτότητα και το περιεχόμενο που το παρείχατε:

const updateElemText = id = content
=> document.querySelector(`#${id}`).textContent = content

// Lock the element's id into the function:
const updateHeaderText = updateElemText('header')

// Update the header text
updateHeaderText("Hello World!")

Σύνθεση συνάρτησης με Curried Functions

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

Για παράδειγμα, σε έναν υποθετικό ιστότοπο ηλεκτρονικού εμπορίου, ακολουθούν τρεις λειτουργίες που μπορεί να θέλετε να εκτελέσετε η μία μετά την άλλη (με ακριβή σειρά):

const addCustomer = fn =>(...args) => {
console.log("Saving customer info")
return fn(...args)
}

const processOrder = fn =>(...args) => {
console.log(`processing order #${args[0]}`)
return fn(...args);
}

let completeOrder = (...args) => {
console.log(`Order #${[...args].toString()} completed.`);
}

Σημειώστε ότι αυτός ο κώδικας χρησιμοποιεί το αφήνω λέξη-κλειδί για τον ορισμό του ολοκληρωμένη παραγγελία() λειτουργία. Αυτό σας επιτρέπει να εκχωρήσετε ξανά μια τιμή στη μεταβλητή και αποτελεί μέρος της πώς λειτουργεί το πεδίο εφαρμογής στο JavaScript.

Στη συνέχεια, πρέπει να καλέσετε τις συναρτήσεις με αντίστροφη σειρά (από μέσα προς τα έξω), επειδή θα θέλατε να προσθέσετε πρώτα τους πελάτες:

completeOrder = (processOrder(completeOrder));
completeOrder = (addCustomer(completeOrder));
completeOrder("1000")

Αυτό θα σας δώσει την ακόλουθη έξοδο:

Εάν επρόκειτο να γράψετε τις παραπάνω συναρτήσεις με τον κανονικό τρόπο, ο κώδικας θα μοιάζει κάπως έτσι:

functionaddCustomer(...args) {
returnfunctionprocessOrder(...args) {
returnfunctioncompleteOrder(...args) {
// end
}
}
}

Όταν καλείτε το addCustomer() συνάρτηση και περάστε στα ορίσματα, ξεκινάτε από μέσα και προχωράτε στην κορυφή της συνάρτησης.

Μετατρέψτε μια κανονική συνάρτηση σε μια συνάρτηση Curried με μια συνάρτηση Curry

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

Αυτή η συνάρτηση θα μετατρέψει οποιαδήποτε κανονική συνάρτηση σε curried συνάρτηση. Χρησιμοποιεί την αναδρομή για να χειριστεί οποιοδήποτε αριθμό ορισμάτων.

const curry = (fn) => {
return curried = (...args) => {
if (fn.length !== args.length) {
return curried.bind(null, ...args)
}

return fn(...args);
}
}

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

const total = (x, y, z) => x + y + z

Για να μετατρέψετε αυτήν τη συνάρτηση, καλέστε το κάρι() λειτουργία και πάσα σύνολο ως επιχείρημα:

const curriedTotal = curry(total)

Τώρα για να καλέσετε τη συνάρτηση, πρέπει απλώς να περάσετε όλα τα ορίσματα:

console.log(curriedTotal(10)(20)(30)) // 60

Περισσότερα για τις Λειτουργίες στο JavaScript

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