Een functie is een container met codeverklaringen die kan worden opgeroepen met behulp van de haakjes ()
operator. Parameters kunnen tijdens het aanroepen binnen de haakjes worden gepasseerd, zodat de instructies in de functie toegang hebben tot bepaalde waarden wanneer de functie wordt aangeroepen.
In de volgende code maken we twee versies van een addNumbers
function objectone using the nieuwe
operator en een ander die het meer gebruikelijke letterlijke patroon gebruikt. Beiden verwachten twee parameters. In elk geval roepen we de functie aan, waarbij parameters tussen haakjes worden doorgegeven ()
operator.
Voorbeeld: sample76.html
Een functie kan worden gebruikt om een waarde te retourneren, een object te construeren of als een mechanisme om eenvoudig code uit te voeren. JavaScript heeft verschillende functies voor functies, maar in de meest eenvoudige vorm is een functie eenvoudigweg een uniek bereik van uitvoerbare instructies.
Functie()
parametersDe Functie()
constructor neemt een onbepaald aantal parameters, maar de laatste parameter verwacht door de Functie()
constructor is een string met instructies die de hoofdtekst van de functie bevatten. Alle parameters die vóór de laatste aan de constructor zijn doorgegeven, zijn beschikbaar voor de functie die wordt gemaakt. Het is ook mogelijk om meerdere parameters als een door komma's gescheiden string te verzenden.
In de volgende code contrasteer ik het gebruik van de Functie()
constructor met de meer algemene patronen van het instantiëren van een functieobject.
Voorbeeld: sample77.html
Direct gebruik maken van de Functie()
constructor wordt niet aanbevolen of wordt meestal alleen maar gedaan omdat JavaScript dit gebruikt eval ()
om de tekenreeks met de functielogica te ontleden. Velen overwegen eval ()
onnodige overheadkosten zijn. Als het in gebruik is, is een fout in het ontwerp van de code hoogst mogelijk.
De ... gebruiken Functie()
constructeur zonder de nieuwe
sleutelwoord heeft hetzelfde effect als alleen de constructor gebruiken om functieobjecten te maken (nieuwe functie ('x', 'return x')
vs. functie (('x', 'return x')
).
Er wordt geen sluiting gemaakt bij het oproepen van de Functie()
constructor rechtstreeks.
Functie()
Eigenschappen en methodenHet functieobject heeft de volgende eigenschappen (exclusief overgenomen eigenschappen en methoden):
Eigenschappen (Function.prototype;
):
prototype
Functieobjectinstanties hebben de volgende eigenschappen en methoden (exclusief overgenomen eigenschappen en methoden):
Instance-eigenschappen (var myFunction = function (x, y, z) ;
myFunction.length;
):
argumenten
bouwer
lengte
Exemplaarmethoden (var myFunction = function (x, y, z) ;
myFunction.toString ();
):
van toepassing zijn()
() aanroepen
toString ()
Hoewel het mogelijk is om een functie te maken om eenvoudig codeverklaringen uit te voeren, is het ook heel gebruikelijk dat een functie een waarde retourneert. In het volgende voorbeeld geven we een tekenreeks uit de zeg gedag
functie.
Voorbeeld: sample78.html
Als een functie geen retourwaarde opgeeft, onbepaald
wordt teruggestuurd. In het volgende voorbeeld noemen we het gekef
functie die de string 'yelp' naar de console registreert zonder expliciet een waarde terug te geven.
Voorbeeld: sample79.html
Het concept om hier weg te nemen is dat alle functies een waarde teruggeven, zelfs als u niet expliciet een waarde geeft om terug te keren. Als u geen waarde opgeeft om te retourneren, is de geretourneerde waarde onbepaald
.
In JavaScript zijn functies objecten. Dit betekent dat een functie kan worden opgeslagen in een variabele, array of object. Ook kan een functie worden doorgegeven aan en geretourneerd door een functie. Een functie heeft eigenschappen omdat het een object is. Al deze factoren maken functies eersteklasburgers in JavaScript.
Voorbeeld: sample80.html
Het is cruciaal dat je je realiseert dat een functie een object is, en dus een waarde. Het kan worden doorgegeven of vergroot zoals elke andere uitdrukking in JavaScript.
Parameters zijn voertuigen om waarden door te geven in het bereik van een functie wanneer deze wordt opgeroepen. In het volgende voorbeeld roepen we aan addFunction ()
. Omdat we het vooraf hebben gedefinieerd om twee parameters te nemen, komen er twee toegevoegde waarden binnen de scope.
Voorbeeld: sample81.html
In tegenstelling tot sommige andere programmeertalen is het volkomen legaal in JavaScript om parameters weg te laten, zelfs als de functie is gedefinieerd om deze argumenten te accepteren. De ontbrekende parameters krijgen gewoon de waarde onbepaald
. Natuurlijk, door waarden voor de parameters weg te laten, werkt de functie mogelijk niet goed.
Als u een functie onverwachte parameters doorgeeft (die niet zijn gedefinieerd toen de functie werd gemaakt), zal er geen fout optreden. En het is mogelijk om toegang te krijgen tot deze parameters van de argumenten
object, dat beschikbaar is voor alle functies.
deze
en argumenten
Waarden zijn beschikbaar voor alle functiesBinnen het bereik en het lichaam van alle functies, de deze
en argumenten
waarden zijn beschikbaar.
De argumenten
object is een arrayachtig object dat alle parameters bevat die aan de functie worden doorgegeven. In de volgende code kunnen we, hoewel we geen parameters opgeven bij het definiëren van de functie, vertrouwen op de argumenten
array doorgegeven aan de functie om toegang te krijgen tot parameters als ze bij aanroep worden verzonden.
Voorbeeld: sample82.html
De deze
sleutelwoord, doorgegeven aan alle functies, is een verwijzing naar het object dat de functie bevat. Zoals je zou verwachten, kunnen functies in objecten als eigenschappen (methoden) worden gebruikt deze
om een verwijzing naar het bovenliggende object te krijgen. Wanneer een functie is gedefinieerd in het globale bereik, is de waarde van deze
is het globale object. Bekijk de volgende code en zorg dat u begrijpt wat deze
komt terug.
Voorbeeld: voorbeeld83.html
arguments.callee
EigendomDe argumenten
object heeft een eigenschap genaamd callee
, wat een verwijzing is naar de functie die momenteel wordt uitgevoerd. Deze eigenschap kan worden gebruikt om naar de functie te verwijzen vanuit het kader van de functie (arguments.callee
) een zelfreferentie. In de volgende code gebruiken we deze eigenschap om een verwijzing naar de aanroepfunctie te krijgen.
Voorbeeld: sample84.html
Dit kan handig zijn als een functie recursief moet worden aangeroepen.
lengte
Eigendom en arguments.length
De argumenten
object heeft een uniek lengte
eigendom. Hoewel je misschien denkt dat deze lengte-eigenschap je het aantal gedefinieerde argumenten zal geven, geeft het feitelijk het aantal parameters dat naar de functie is gestuurd gedurende het aanroepen.
Voorbeeld: sample85.html
De ... gebruiken lengte
eigendom van iedereen Functie()
In dergelijke gevallen kunnen we het totale aantal parameters dat de functie verwacht in beslag nemen.
Voorbeeld: sample86.html
De arguments.length
eigenschap is verouderd in JavaScript 1.4, maar het aantal argumenten dat naar een functie is verzonden, is toegankelijk via de lengte
eigenschap van het functieobject. Als u vooruit gaat, kunt u de lengtewaarde krijgen door gebruik te maken van de callee
eigenschap om eerst de verwijzing te krijgen naar de functie die wordt opgeroepen (arguments.callee.length
).
Een functieparameter kan binnen de functie opnieuw worden gedefinieerd, hetzij direct, of met behulp van de argumenten
matrix. Bekijk deze code:
Voorbeeld: sample87.html
Merk op dat ik de waarde van de barparameter kan herdefiniëren met behulp van de argumenten
index of door direct een nieuwe waarde toe te wijzen aan de parameter.
Functies kunnen op elk moment tijdens het aanroepen worden geannuleerd met behulp van de terugkeer
sleutelwoord met of zonder een waarde. In het volgende voorbeeld annuleren we de toevoegen
functie als de parameters ongedefinieerd zijn of geen getal.
Voorbeeld: sample88.html
Het concept om hier afstand van te nemen is dat u de uitvoering van een functie kunt annuleren met behulp van de terugkeer
sleutelwoord op elk punt in de uitvoering van de functie.
Een functie kan op drie verschillende manieren worden gedefinieerd: een functieconstructor, een functie-instructie of een functie-uitdrukking. In het volgende voorbeeld demonstreer ik elke variatie.
Voorbeeld: sample89.html
Sommigen hebben gezegd dat er een vierde type definitie is voor functies, genaamd de "named function expression". Een benoemde functie-uitdrukking is eenvoudigweg een functie-uitdrukking die ook een naam bevat (bijv., var add = function add (x, y) return x + y
).
() aanroepen
en van toepassing zijn()
)Functies worden aangeroepen met behulp van vier verschillende scenario's of patronen.
van toepassing zijn()
of () aanroepen
In het volgende voorbeeld onderzoeken we elk van deze aanroeppatronen.
Voorbeeld: sample90.html
Zorg ervoor dat u op de hoogte bent van alle vier de aanroeppatronen, omdat de code die u tegenkomt mogelijk een van deze bevat.
Een anonieme functie is een functie die geen ID krijgt. Anonieme functies worden meestal gebruikt voor het doorgeven van functies als parameter aan een andere functie.
Voorbeeld: sample91.html
Een functie-expressie (eigenlijk elke functie behalve een die is gemaakt op basis van de Functie()
constructor) kan na definitie direct worden opgeroepen met behulp van de operator haakjes. In het volgende voorbeeld maken we een zeg woord()
functie-expressie en roep dan onmiddellijk de functie op. Dit wordt beschouwd als een zichzelf aanroepende functie.
Voorbeeld: sample92.html
Het is mogelijk om een anonieme functie-instructie te maken die automatisch wordt aangeroepen. Dit wordt een zelfoproepende anonieme functie genoemd. In het volgende voorbeeld maken we verschillende anonieme functies die onmiddellijk worden aangeroepen.
Voorbeeld: sample93.html
Volgens de ECMAScript-standaard zijn de haakjes rond de functie (of iets dat de functie omzet in een uitdrukking) vereist als de functie onmiddellijk moet worden opgeroepen.
Functies kunnen voor onbepaalde tijd in andere functies worden genest. In het volgende codevoorbeeld kapselen we de goo
functie binnen in de bar
functie, die zich in de foo
functie.
Voorbeeld: sample94.html
Het eenvoudige concept hier is dat functies kunnen worden genest en er is geen limiet aan hoe diep het nesten kan gaan.
Denk eraan, de waarde van deze
voor geneste functies is het hoofdobject (de venster
object in een webbrowser) in JavaScript 1.5, ECMA-262, Edition 3.
Zoals eerder vermeld, zijn functies eersteklasburgers in JavaScript. En aangezien een functie een waarde is en een functie elke soort waarde kan worden doorgegeven, kan een functie aan een functie worden doorgegeven. Functies die andere functies aannemen en / of teruggeven, worden ook wel "hogere-orde-functies" genoemd.
In de volgende code geven we een anonieme functie door aan de foo
functie die we dan meteen terughalen van de foo
functie. Het is deze anonieme functie die de variabele is bar
wijst op, sinds foo
accepteert en retourneert vervolgens de anonieme functie.
Voorbeeld: sample95.html
Dus wanneer bar
wordt aangeroepen, roept het de anonieme functie op die is doorgegeven aan de foo ()
functie, die vervolgens wordt doorgegeven vanaf de foo ()
functie en waarnaar wordt verwezen vanuit de bar
variabel. Dit alles om te laten zien dat functies net als elke andere waarde kunnen worden doorgegeven.
Een functie-instructie kan worden aangeroepen tijdens de uitvoering voor de eigenlijke definitie. Dit is een beetje vreemd, maar je moet je ervan bewust zijn, zodat je er gebruik van kunt maken, of op zijn minst weet wat er gebeurt als je het tegenkomt. In het volgende voorbeeld roep ik de sayYo ()
en som()
functieverklaringen voordat ze worden gedefinieerd.
Voorbeeld: sample96.html
Dit gebeurt omdat voordat de code wordt uitgevoerd, functieverklaringen worden geïnterpreteerd en aan de uitvoeringsstapel / context worden toegevoegd. Zorg dat u hiervan op de hoogte bent als u functie-instructies gebruikt.
Functies die zijn gedefinieerd als functie-uitdrukkingen worden niet opgehesen. Alleen functieverklaringen worden gehesen.
Het is volkomen legitiem dat een functie zichzelf roept. In feite wordt dit vaak gebruikt in bekende codeerpatronen. In de code die volgt, beginnen we met de countDownFrom
functie, die zichzelf vervolgens via de functienaam oproept countDownFrom
. In essentie creëert dit een lus die aftelt van 5 naar 0.
Voorbeeld: sample97.html
Je moet je ervan bewust zijn dat het normaal is dat een functie zichzelf oproept (ook wel recursie genoemd) of herhaaldelijk.
Functies zijn een van de meest gebruikte aspecten van JavaScript, hopelijk heb je nu een beter begrip van hoe je ze kunt gebruiken.