poměrně často musíme provést podobnou akci na mnoha místech skriptu.
například musíme ukázat pěkně vypadající zprávu, když se návštěvník přihlásí, odhlásí se a možná někde jinde.funkce
jsou hlavními „stavebními kameny“ programu. Umožňují, aby byl kód volán mnohokrát bez opakování.
již Jsme viděli příklady vestavěných funkcí, jako je alert(message)
prompt(message, default)
confirm(question)
. Ale můžeme vytvářet i vlastní funkce.,
deklarace funkce
pro vytvoření funkce můžeme použít deklaraci funkce.
vypadá To jako toto:
function showMessage() { alert( 'Hello everyone!' );}
function
klíčové slovo je první, pak jde o jméno funkce, seznam parametrů mezi závorky (oddělených čárkou, prázdné v příkladu výše) a konečně kód funkce, také jmenoval „funkce těla“, mezi složené závorky.,
function name(parameters) { ...body...}
Naše nové funkce mohou být volány jeho jméno: showMessage()
.
například:
function showMessage() { alert( 'Hello everyone!' );}showMessage();showMessage();
volat showMessage()
spustí kód funkce. Zde uvidíme zprávu dvakrát.
tento příklad jasně ukazuje jeden z hlavních účelů funkcí: vyhnout se duplikaci kódu.,
Pokud někdy potřebujeme změnit zprávu nebo způsob, jakým je zobrazena, stačí upravit kód na jednom místě: funkci, která jej vysílá.
lokální proměnné
proměnná deklarovaná uvnitř funkce je viditelná pouze uvnitř této funkce.
například:
Vnější proměnné
funkce mohou přístup k vnější proměnné, například:
let userName = 'John';function showMessage() { let message = 'Hello, ' + userName; alert(message);}showMessage(); // Hello, John
funkce má plný přístup do vnější proměnné. Může to také upravit.,
například:
vnější proměnná se používá pouze v případě, že není lokální.
Pokud je uvnitř funkce deklarována stejná proměnná, pak stínuje vnější proměnnou. Například v kódu pod funkcí používá místní userName
. Ten vnější je ignorovat:
Proměnné deklarované mimo všechny funkce, jako je vnější userName
v kódu výše, se nazývají globální.
globální proměnné jsou viditelné z libovolné funkce (pokud není zastíněno místními obyvateli).,
je dobré minimalizovat používání globálních proměnných. Moderní kód má málo nebo žádné globály. Většina proměnných sídlí ve svých funkcích. Někdy však mohou být užitečné pro ukládání dat na úrovni projektu.
parametry
můžeme předat libovolná data funkcím pomocí parametrů (také nazývaných Funkční argumenty) .
v níže uvedeném příkladu má funkce dva parametry: from
a text
.,
Když funkce je volána v řádcích (*)
(**)
, dané hodnoty jsou kopírovány do lokální proměnné from
text
. Pak je funkce používá.
zde je další příklad: máme proměnnou from
a předáme ji funkci., Vezměte prosím na vědomí: tato funkce se mění v from
, ale změna není vidět ven, protože funkce vždy dostane kopii hodnoty:
Výchozí hodnoty
Pokud parametr není k dispozici, pak se jeho hodnota se stává undefined
.
například, výše uvedené funkce showMessage(from, text)
může být volána s jedním argumentem:
showMessage("Ann");
to není chyba. Takový hovor by výstup "*Ann*: undefined"
., Neexistuje text
, takže se předpokládá, že text === undefined
.,
chceme-Li použít „výchozí“ text
v tomto případě, pak se můžeme zadat po =
:
function showMessage(from, text = "no text given") { alert( from + ": " + text );}showMessage("Ann"); // Ann: no text given
pokud text
parametr není předán, to bude mít hodnotu "no text given"
Zde "no text given"
je řetězec, ale může být složitější výraz, který je pouze vyhodnocovány a přiřazeny pokud parametr chybí., To je také možné:
v JavaScriptu je výchozí parametr vyhodnocen pokaždé, když je funkce volána bez příslušného parametru.
V příkladu výše anotherFunction()
je volána pokaždé, když showMessage()
se nazývá bez text
parametr.
Alternativní výchozí parametry
Někdy to dává smysl, aby nastavit výchozí hodnoty pro parametry nejsou v deklaraci funkce, ale v pozdější fázi, během jejího plnění.,parametr, můžeme porovnat s undefined
:
function showMessage(text) { if (text === undefined) { text = 'empty message'; } alert(text);}showMessage(); // empty message
Nebo můžeme použít ||
provozovatel:
// if text parameter is omitted or "" is passed, set it to 'empty'function showMessage(text) { text = text || 'empty'; ...}
Moderní Javascriptové enginy podporují nullish coalescing operator ??
, to je lepší, když falsy hodnoty, jako např. 0
, jsou považovány za normální:
Vrací hodnotu
funkce může vrátit hodnotu zpět do volající kód jako výsledek.,
nejjednodušší příklad by funkce, která shrnuje dvě hodnoty:
function sum(a, b) { return a + b;}let result = sum(1, 2);alert( result ); // 3
směrnice return
může být v jakémkoli místě z funkce. Při výkonu dosáhne, funkce se zastaví a hodnota je vrácena volající kód (přidělený result
výše).
v jedné funkci může být mnoho výskytů return
. Například:
je možné použít return
bez hodnoty., That causes the function to exit immediately.
For example:
function showMovie(age) { if ( !checkAge(age) ) { return; } alert( "Showing you the movie" ); // (*) // ...}
In the code above, if checkAge(age)
returns false
, then showMovie
won’t proceed to the alert
.,
return
a hodnotaPo dlouhou výraz v return
, to by mohlo být lákavé dát to na samostatném řádku, jako je tento:
return (some + long + expression + or + whatever * f(a) + f(b))
To nebude fungovat, protože JavaScript předpokládá, středník po return
. To bude fungovat stejně jako:
return; (some + long + expression + or + whatever * f(a) + f(b))
takže se účinně stává prázdným návratem.,
Pokud chceme, aby se vrátil výraz zabalit přes více řádků, měli bychom jej spustit na stejném řádku jako return
. Nebo alespoň dát otevření závorky tam takto:
return ( some + long + expression + or + whatever * f(a) + f(b) )
A bude to fungovat stejně, jak očekáváme.
pojmenování funkce
funkce jsou akce. Takže jejich jméno je obvykle sloveso. Mělo by být stručné, co nejpřesnější a popsat, co funkce dělá, aby někdo, kdo čte kód, dostal informaci o tom, co funkce dělá.,
je rozšířenou praxí spustit funkci s verbální předponou, která neurčitě popisuje akci. V týmu musí být dohoda o významu předpon.
například funkce, které začínají "show"
obvykle něco ukazují.
Funkce začíná
Příklady takových jmen:
S prefixy v místě, pohled na název funkce dává pochopení toho, co druh práce, kterou dělá a jaké hodnoty vrací.,
funkce by měla dělat přesně to, co je navrženo jejím jménem, nic víc.
Dvě nezávislé akce obvykle si zaslouží dvě funkce, i když jsou obvykle nazývány společně (v takovém případě můžeme udělat 3. funkce volání těch dvou).
několik příkladů porušení tohoto pravidla:
-
getAge
– by špatné, kdyby to ukazujealert
s věkem (třeba jen)., -
createForm
– by špatné, kdyby to upravuje dokument, přidání formuláře je (měl by pouze vytvořit a vrátit se). -
checkPermission
– by špatné, kdyby to zobrazujeaccess granted/denied
zpráva (třeba pouze provést kontrolu a vrátí výsledek).
tyto příklady předpokládají běžné významy předpon. Vy a váš tým se můžete dohodnout na jiných významech, ale obvykle se příliš neliší. V každém případě byste měli mít pevné pochopení toho, co předpona znamená, co prefixovaná funkce může a nemůže dělat., Všechny stejné-prefixované funkce by se měly řídit pravidly. A tým by měl sdílet znalosti.
funkce, které se používají velmi často, někdy mají ultrakrátké názvy.
například jQuery framework definuje funkci s $
. Knihovna Lodash má svou základní funkci s názvem _
.
jedná se o výjimky. Obecně funkce názvy by měly být stručné a popisné.
funkce == Komentáře
funkce by měly být krátké a dělat přesně jednu věc., Pokud je tato věc velká, možná stojí za to rozdělit funkci na několik menších funkcí. Někdy dodržování tohoto pravidla nemusí být tak snadné, ale je to určitě dobrá věc.
samostatná funkce je nejen snazší testovat a ladit – její samotná existence je skvělý komentář!
například porovnejte obě funkce showPrimes(n)
níže. Každý z nich výstupy prvočísla až n
.,
první varianta používá označení:
function showPrimes(n) { nextPrime: for (let i = 2; i < n; i++) { for (let j = 2; j < i; j++) { if (i % j == 0) continue nextPrime; } alert( i ); // a prime }}
druhá varianta využívá další funkce isPrime(n)
test prvočíselnosti:
druhá varianta je jednodušší na pochopení, není to? Místo kódu vidíme název akce (isPrime
). Někdy lidé odkazují na takový kód jako self-popisující.
takže funkce mohou být vytvořeny, i když je nemáme v úmyslu znovu použít. Strukturují kód a činí jej čitelným.,
Shrnutí
deklarace funkce vypadá takhle:
function name(parameters, delimited, by, comma) { /* code */}
- Hodnoty předán do funkce jako parametry jsou zkopírovány do své lokální proměnné.
- funkce může přistupovat k vnějším proměnným. Ale funguje to jen zevnitř ven. Kód mimo funkci nevidí jeho místní proměnné.
- funkce může vrátit hodnotu. Pokud tomu tak není, pak je jeho výsledkem
undefined
.,
aby byl kód čistý a snadno pochopitelný, doporučuje se používat hlavně lokální proměnné a parametry ve funkci, nikoli vnější proměnné.
To je vždy snazší, aby pochopili funkci, která dostane parametry, pracuje s nimi a vrátí výsledek, než funkce, která nemá žádné parametry, ale změní vnější proměnné, jako vedlejší účinek.
pojmenování funkcí:
- název by měl jasně popsat, co funkce dělá. Když vidíme volání funkce v kódu, dobré jméno nám okamžitě dává pochopení toho, co dělá a vrací se.,
- funkce je akce, takže názvy funkcí jsou obvykle slovní.
- Existuje mnoho dobře-známé funkce předpony jako
create…
show…
get…
check…
, a tak dále. Použijte je, abyste naznačili, co funkce dělá.
funkce jsou hlavními stavebními kameny skriptů. Nyní jsme se zabývali základy, takže je vlastně můžeme začít vytvářet a používat. Ale to je jen začátek cesty. Vrátíme se k nim mnohokrát, hlouběji do jejich pokročilých funkcí.
Napsat komentář