Niet-verplichte argumenten in JavaScript-functions
Anders dan in de meeste programmeer- en scripttalen kun je in JavaScript functions aanroepen met een wisselend aantal argumenten. Op deze bladzijde wordt uitgelegd hoe dat in zijn werk gaat en waar je op moet letten als je het wilt toepassen.
- Functions in JavaScript hebben altijd een parameterlijst. Deze lijst staat tussen de haakjes, direct achter de naam van de function. De lijst kan leeg zijn, of argumenten bevatten.
- Als je een lege parameterlijst opgeeft bij de definitie van de function hoeft dat niet te betekenen dat je bij de aanroep van de function geen parameters kunt meegeven. Het is een kwestie van programmeren hoe de function daar mee om gaat.
- Als je parameters opgeeft bij de definitie van de function betekent dat niet dat je alle parameters ook
daadwerkelijk moet gebruiken bij de aanroep. Ook dit is een kwestie van programmeren.
- In JavaScript is elke function een object. Een van de eigenschappen van dat object is arguments, dat zelf ook weer een object is. Het is een array waarin de argumenten staan, in de volgorde die je hebt gebruikt bij de aanroep van de function.
- Elke function heeft automatisch een object arguments. Dat hoef je zelf niet op te geven.
- Door arguments aan een variabele toe te kennen kun je de afzonderlijke waarden ervan gebruiken in je script. Je kunt ook de eigenschap length gebruiken om het aantal elementen in arguments te bepalen.
- Argumenten die in de parameterlijst staan genoemd kun je binnen de function gebruiken met hun naam. Je kunt ze echter ook benaderen via arguments.
- Argumenten die niet de de parameterlijst staan zijn alleen bereikbaar via arguments.
- Je gebruikt arguments zoals hieronder is aangegeven. De naam van de function wordt tevens
gebruikt om het object arguments van de function te benaderen:
function abcd(xx,yy,zz) {
var argv = abcd.arguments; // de argumentenlijst
var argc = abcd.arguments.length; // het aantal argumenten
.
code
.
} // Einde van de function abcd - Belangrijk: Parameters mogen alleen aan het einde van de lijst worden weggelaten. De aanroep:
abcd(1,,3) is ongeldig.
De aanroep abcd(1) of: abcd(1,2) of: abcd(1,2,3) is wel goed.
- Of het opgeven van een een parameter wel of niet verplicht is, volgt uit de programmering van de function.
Parameters waar binnen de function zelf aan wordt gerefereerd zijn verplicht. Dat spreekt voor zich. (Als je een parameter niet opgeeft en er wordt toch aan gerefereerd, dan neemt die automatisch de waarde null aan. Dat kun je gebruiken om na te gaan of de parameter is opgegeven.) - Gebruikelijk is om alle parameters op te geven, tenzij er reden is om het niet te doen. Maar dan moet
je wel zeker weten dat er binnen de function voorzieningen zijn getroffen om dat op te vangen.
- Tenslotte:
- Het resultaat van een function wordt aan het script terug gegeven via het return statement.
- Je kunt een function meerdere variabelen tegelijkertijd laten wijzigen. Dit heet side-effect. Het is alleen mogelijk met globale variabelen, die buiten de function dus ook betekenis hebben.
- Parameters in de lijst dienen alleen als invoer. Als de function parameters wijzigt geldt dat zolang de function actief is. Na afloop van de function zijn die wijzigingen verdwenen.
Toepassing:
- Code:
function Voorbeeld(a,b,c) {
var argv = Voorbeeld.arguments;
var argc = Voorbeeld.arguments.length;
// Heleboel er mee doen
}
- Aanroep: Voorbeeld(1,2,3,4,5,6)
In function Voorbeeld is argv de array (1,2,3,4,5,6). argv[0] = 1, argv[1] = 2, enz.
Het aantal elementen in de array argv is argc = 6.
argument a = argv[0] = 1;
argument b = argv[1] = 2;
argument c = argv[2] = 3;
De overige argumenten van Voorbeeld staan in argv[3], argv[4], enz. Hiervoor zijn geen argument-namen beschikbaar.
Voorbeeld-codes:
- Bereken het gemiddelde van een onbepaald aantal argumenten. Alle parameters zijn optioneel.
Merk op dat er in de code rekening mee wordt gehouden dat er ook géén argumenten kunnen zijn.function Gemiddeld() {
var argv = Gemiddeld.arguments; // Lijst met argumenten
var argc = Gemiddeld.arguments.length; // Aantal argumenten in de lijst
var som = 0; // bereken de som van de argumenten
for (i=0; i < argc; i++) {
som += argv[i];
} // bepaal gemiddelde en vang mogelijke deling door nul op
var gem = (argc == 0) ? som : som/argc;
return gem;
} - Function om een cookie te maken. De parameters name en value zijn verplicht.
Merk op dat de aanwezigheid van name en value niet wordt afgedwongen. Er wordt van uit gegaan dat ze er zijn. De overige argumenten staan niet in de parameterlijst en zijn daarom alleen bereikbaar via arguments.function SetCookie(name, value) {
var argv = SetCookie.arguments; // Lijst met argumenten
var argc = SetCookie.arguments.length; // Lijst met argumenten
/* Stel de Cookie-variabelen in */
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
/* Maak de cookie-string */
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
} - Gebruik default waarden voor ontbrekende parameters. De namen van de parameters zijn 'cosmetisch'.
Ze worden hier verder niet gebruikt en zouden dus weggelaten mogen worden.
function xyz(fly,speed,steps) {
// Stel zonodig de defaults in voor speed en steps
var argv = xyz.arguments;
var argc = xyz.arguments.length;
if (argc == 0) { // Parameter 'fly' is verplicht
window.alert('Fout!!!!');
return(false);
}
var spd = (argc > 1) ? argv[1] : 50; // Default voor speed = 50
var stp = (argc > 2) ? argv[2] : 100; // Default voor steps = 100
.
code
.
}