TOC

This article has been localized into Czech by the community.

Funkce:

Parametry funkce s výchozími hodnotami

V předchozím článku jsme viděli spoustu zajímavých věcí, které můžeme dělat s parametry funkcí. Z příkladů jsme se také dozvěděli, že JavaScript je poměrně flexibilní, pokud jde o parametry funkcí - moc nezáleží na tom, zda při volání funkce dodáte očekávané argumenty, nebo ne. Místo toho bude jakýkoli parametr funkce, který není volajícím předán do funkce, výchozí hodnotou "undefined".

Nicméně někdy má smysl poskytnout pro parametr výchozí hodnotu namísto "undefined". Před specifikací ES6 JavaScript nepovoloval toto dělat přímo, ale dalo se to takto obejít:

function AddNumbers(n1, n2)
{	
	if(n1 === undefined)
		n1 = 0;
	if(n2 === undefined)
		n2 = 0;
	return n1 + n2;
}

alert(AddNumbers());

Všimněte si, jak funkce definuje dva parametry, ale když ji v posledním řádku volám, neposkytnu pro ni žádné argumenty. Nicméně ve funkci vlastně provedu několik kontrol, abychom zajistili, že definujeme hodnotu pro parametry (n1 a n2), pokud volající funkce neposkytne žádnou hodnotu - parametry nyní mají výchozí/náhradní hodnotu 0.

Jedním z problémů tohoto přístupu, kromě toho, že do vaší funkce přidává několik řádků nudného kódu, je skutečnost, že volající funkce nemůže vědět, že tyto parametry nejsou ve skutečnosti požadovány, protože mají náhradní/výchozí hodnotu. Naštěstí pro nás byly ve specifikaci ES6 zavedeny výchozí parametry, které vám umožňují definovat výchozí hodnotu pro parametr funkce.

Jednoduché výchozí hodnoty

Syntaxe pro definování výchozích hodnot parametru je poměrně jednoduchá - stačí mu přímo v deklaraci funkce přiřadit hodnotu. Tato hodnota bude sloužit jako náhradní hodnota místo "undefined", pokud volající funkce ji neposkytne. Zde je příklad:

function AddNumbers(n1 = 0, n2 = 0, n3 = 0)
{	
	return n1 + n2 + n3;
}

alert(AddNumbers());
alert(AddNumbers(5, 10));
alert(AddNumbers(5, 5, 10));

Nyní jsem definoval výchozí hodnoty pro všechny parametry (0) a, jak vidíte, mohu poté stejnou funkci volat s nulou nebo více argumenty, aniž bych musel ve funkci kontrolovat parametry pro "undefined".

Při volání funkce s výchozími hodnotami parametrů se někdy ocitnete v situaci, kdy chcete použít náhradní hodnotu pro první parametr, ale poskytnout jinou hodnotu pro jeden z dalších parametrů. Obtížná část zde samozřejmě je, že pokud chcete poskytnout hodnotu pro parametr č. 2, jak dáte JavaScriptu vědět, že nechcete poskytnout hodnotu pro parametr č. 1? Zde je příklad, kde to právě děláme:

function Greet(greeting = "Hello", target = "World")
{
	alert(greeting + ", " + target + "!");
}

Greet();
Greet("Hi");
Greet(undefined, "Universe");

Voláme funkci Greet() s různými parametry, ale všimněte si posledního řádku, kde ji voláme se dvěma argumenty: První argument je jednoduše nastaven na undefined, protože když má funkce deklarovanou výchozí hodnotu, JavaScript vždy použije tuto místo undefined. To nám umožňuje dodat skutečnou hodnotu pro druhý parametr, zatímco stále používáme náhradní hodnotu pro první parametr.

Složité výchozí hodnoty

V některých programovacích jazycích jsou výchozí hodnoty parametrů funkcí omezeny na konstantní hodnoty, např. jednoduchá čísla a textové řetězce. JavaScript je v tomto ohledu mnohem flexibilnější. Ve skutečnosti můžete dělat téměř cokoli - JavaScript jednoduše vyhodnotí příkaz, který dodáte, jako jakýkoli jiný druh JavaScriptového kódu při volání funkce. Podívejme se na některé věci, které vám to umožní dělat.

Matematické operace a odkazování na další parametry

Všimněte si prosím: Tento příklad je sám o sobě zcela zbytečný, ale jednoduše vám ukazuje, že můžete provádět matematické operace, dokonce odkazovat na další parametry, při definování výchozích hodnot parametrů:

function AddNumbers(n1 = 0, n2 = 2 + 2, n3 = n2 - 8)
{	
	return n1 + n2 + n3;
}

alert(AddNumbers());

Vytváření instancí objektů

Můžete vytvořit instance nových objektů a použít je jako výchozí hodnoty, například objekt Date, takto:

function Greet(greeting = "Hello", target = "World", date = new Date())
{
	alert("A greeting from " + date.toString() + ": " + greeting + ", " + target + "!");
}

Greet();

Volání funkcí

Stejně jako můžete vytvořit instanci objektu, můžete samozřejmě zavolat jednoduchou funkci a použít vrácenou hodnotu jako výchozí hodnotu pro parametr:

function AddNumbers(n1 = 0, n2 = Math.random() * 10)
{	
	return n1 + n2;
}

alert(AddNumbers());

V tomto příkladu volám funkci Math.random(), abych získal náhodné číslo mezi 0 a 1, a poté ho vynásobím 10, pro druhý parametr.

Povinné parametry s použitím výchozích hodnot

Samozřejmě můžete svobodně volat i své vlastní funkce, a ve skutečnosti to umožňuje udělat něco docela zajímavého. Dříve jsme mluvili o tom, že JavaScript nenutí zadávat parametry při volání funkce - pokud funkce deklaruje jeden nebo více parametrů, můžete tuto funkci volat bez specifikace jakýchkoli parametrů.

V této situaci funkce musí zpracovat skutečnost, že nemůže spoléhat na to, že parametry budou mít nějakou hodnotu, obvykle tím, že poskytne výchozí hodnotu nebo tím, že před použitím parametru zkontroluje, zda má očekávanou hodnotu. Nicméně někdy to není optimální a přáli byste si, aby JavaScript nutil volající funkci poskytnout očekávané množství proměnných a chvála bohu, můžeme to skutečně docílit použitím výchozích hodnot:

function Required()
{
	// Leave out the alert if using this code
	alert("Please specify a value for this function parameter!");
	throw new Error("Please specify a value for this function parameter!");
}

function AddNumbers(n1 = Required(), n2 = Required())
{	
	return n1 + n2;
}

alert(AddNumbers());
alert(AddNumbers(5, 10));

Nejdříve a především: Pravděpodobně byste neměli zahrnovat část s alert(), pokud používáte tento kód - je zde pouze k tomu, abych vám ukázal, že se něco děje, pokud tento příklad spustíte. V reálném scénáři pravděpodobně nechcete uživatele vašich stránek obtěžovat implementačními detaily jako je tento.

Takže to, co zde dělám, je, že jsem definoval funkci nazvanou Required(). Tuto funkci nastavuji jako výchozí hodnotu pro oba parametry funkce AddNumbers(), což znamená, že pokud je funkce AddNumbers() volána s nedostatečnými argumenty, funkce Required() je automaticky zavolána. Ve funkci Required() pak vyvoláváme chybu (Error), což zastaví běh kódu.

Tímto způsobem jsme se ujistili, že nic opravdu nefunguje, pokud volající funkce neposkytne parametry, a tím jsou tedy parametry vyžadovány. Jinými slovy jsme právě přidali funkci do jazyka JavaScript, která předtím neexistovala, díky extrémní flexibilitě jazyka obecně a zvláště výchozím hodnotám funkcí. Skvělé, že ano?

Shrnutí

S výchozími hodnotami parametrů můžete dodat svým funkcím záložní hodnoty, které budou použity, pokud volající funkce žádné nedodá. Výchozí hodnoty parametrů mohou být jednoduché typy, jako jsou čísla nebo řetězce, nebo dokonce složitější operace, jako je volání funkce.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!