--- title: Προεπιλεγμένες παράμετροι slug: Web/JavaScript/Reference/Functions/Προεπιλεγμένες_παράμετροι tags: - ECMAScript 2015 - JavaScript - Συναρτήσεις translation_of: Web/JavaScript/Reference/Functions/Default_parameters ---
Οι προεπιλεγμένες παράμετροι συναρτήσεων επιτρέπουν την αρχικοποίηση των παραμέτρων με προεπιλεγμένες τιμες, αν η τιμή λείπει ή ειναι τύπου undefined
.
Ο πηγαίος κώδικας αυτού του διαδραστικού παραδείγματος είναι αποθηκευμένος σε ενα GitHub αποθετήριο. Αν θα θέλατε να συμβάλλετε στο έργο των διαδραστικών παραδειγμάτων, παρακαλώ κάντε clone το https://github.com/mdn/interactive-examples και στείλτε μας ενα pull request.
function [όνομα]([παράμ1[ = προεπιλεγμένηΤιμή1 ][, ..., παράμN[ = προεπιλεγμένηΤιμήN ]]]) {δηλώσεις }
Στην JavaScript, οι προεπιλεγμένες παράμετροι των συναρτήσεων ειναι τύπου {{jsxref("undefined")}}
. Ωστόσο, σε κάποιες καταστάσεις μπορεί να χρειαστεί να θέσουμε μια διαφορετική προεπιλεγμένη τιμή. Σε αυτή την περίπτωση μπορούν βοηθήσουν οι προεπιλεγμένες παράμετροι.
Στο παρελθόν, η γενική στρατηγική ορισμού προεπιλεγμένων τιμών, ηταν ο έλεγχος των τιμών στο σώμα την συνάρτησης και η εκχώρηση τιμής στην περίπτωση που ήταν τύπου undefined
. Αν στο επόμενο παράδειγμα, δεν δοθεί τιμή για την b
οταν κλήθει η συναρτηση, η τιμή της θα ήταν undefined
κατα την εκτίμηση του a*b
και η κλήση της multiply
θα επέστρεφε NaN
. Ωστόσο, αυτό αποτρέπεται στην δεύτερη γραμμή του παραδείγματος:
function multiply(a, b) { b = (typeof b !== 'undefined') ? b : 1; return a * b; } multiply(5, 2); // 10 multiply(5, 1); // 5 multiply(5); // 5
Με τις προεπιλεγμένες παραμέτρους στην ES2015, ο έλεγχος στο σώμα της συνάρτησης δεν ειναι πια απαραίτητος. Τωρα μπορούμε απλα να θέσουμε 1
ως προεπιλεγμένη τιμή της b
στην κεφαλή της συνάρτησης:
function multiply(a, b = 1) { return a * b; } multiply(5, 2); // 10 multiply(5, 1); // 5 multiply(5); // 5
undefined
σε αντίθεση με άλλες falsy τιμεςΣτην δεύτερη κλήση εδω, ακόμα και αν η δεύτερη παράμετρος είναι ρητά undefined
(αλλά οχι null
ή άλλες falsy τιμές) κατα την κλήση, η τιμή της παραμέτρου num
είναι η προεπιλεγμένη.
function test(num = 1) { console.log(typeof num); } test(); // 'number' (η num παίρνει τιμή 1) test(undefined); // 'number' (η num επίσης παίρνει τιμή 1) // test with other falsy values: test(''); // 'string' (η num παίρνει τιμή '') test(null); // 'object' (η num παίρνει τιμή null)
Η προεπιλεγμένη παράμετρος εκτιμάται κατα την κλήση, οπότε αντίθετα με την Python για παραδειγμα, ενα νεο αντικείμενο δημιουργείται καθε φορά που καλείται η συνάρτηση.
function append(value, array = []) { array.push(value); return array; } append(1); //[1] append(2); //[2], όχι [1, 2]
Αυτό εφαρμόζεται ακομα και στις συναρτήσεις και τις μεταβλητές:
function callSomething(thing = something()) { return thing; } function something() { return 'sth'; } callSomething(); //sth
Οι παράμετροι που εχουν ήδη συναντηθεί είναι διαθέσιμες και στις επόμενες προεπιλεγμένες παραμέτρους:
function singularAutoPlural(singular, plural = singular + 's', rallyingCry = plural + ' ATTACK!!!') { return [singular, plural, rallyingCry]; } //["Gecko","Geckos", "Geckos ATTACK!!!"] singularAutoPlural('Gecko'); //["Fox","Foxes", "Foxes ATTACK!!!"] singularAutoPlural('Fox', 'Foxes'); //["Deer", "Deer", "Deer ... change."] singularAutoPlural('Deer', 'Deer', 'Deer peaceably and respectfully \ petition the government for positive change.')
Αυτή η λειτουργικότητα υπολογίζεται σταδιακά. Το επόμενο παράδειγμα επιδεικνύει το πως χειρίζονται άλλες ακραίες περιπτώσεις.
function go() { return ':P'; } function withDefaults(a, b = 5, c = b, d = go(), e = this, f = arguments, g = this.value) { return [a, b, c, d, e, f, g]; } function withoutDefaults(a, b, c, d, e, f, g) { switch (arguments.length) { case 0: a; case 1: b = 5; case 2: c = b; case 3: d = go(); case 4: e = this; case 5: f = arguments; case 6: g = this.value; default: } return [a, b, c, d, e, f, g]; } withDefaults.call({value: '=^_^='}); // [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="] withoutDefaults.call({value: '=^_^='}); // [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]
Εισάχθηκε στο Gecko 33 {{geckoRelease(33)}}. Οι συναρτήσεις που ορίζονται στο σώμα της συνάρτησης δεν μπορούν να αναφέρονται στίς προεπιλεγμένες παραμέτρους και εμφανίζουν ενα {{jsxref("ReferenceError")}} (αυτή τη στιγμή {{jsxref("TypeError")}} στο SpiderMonkey, βλέπε {{bug(1022967)}}). Οι προεπιλεγμένες παράμετροι εκτελούνται παντα πρώτες και στην συνέχεια εκτελούνται οι δηλώσεις που βρίσκονται στο σώμα της συνάρτησης.
// Doesn't work! Throws ReferenceError. function f(a = go()) { function go() { return ':P'; } }
Πριν απο το Gecko 26 {{geckoRelease(26)}}, ο ακόλουθος κώδικας προκαλούσε ένα {{jsxref("SyntaxError")}}. Αυτό επιδιορθώθηκε στο {{bug(777060)}} και έχει την αναμενόμενη λειτουργία σε επόμενες εκδόσεις. Οι παράμετροι ορίζονται ακόμα απο τα αριστερά στα δεξιά, αντικαθιστώντας προεπιλεγμένες παραμέτρους ακόμα και αν υπάρχουν επόμενες παράμετροι χωρίς προεπιλεγμένες τιμές.
function f(x = 1, y) { return [x, y]; } f(); // [1, undefined] f(2); // [2, undefined]
Στον ορισμό προεπιλεγμένων παραμέτρων μπορεί να χρησιμοποιηθεί αποδομημένη ανάθεση:
function f([x, y] = [1, 2], {z: z} = {z: 3}) { return x + y + z; } f(); // 6
Προδιαγραφή | Κατάσταση | Σχόλιο |
---|---|---|
{{SpecName('ES2015', '#sec-function-definitions', 'Function Definitions')}} | {{Spec2('ES2015')}} | Αρχικός ορισμός. |
{{SpecName('ESDraft', '#sec-function-definitions', 'Function Definitions')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.functions.default_parameters")}}