JavaScript/Annonieme functies
Vorige: Functies | Index | Volgende: Objectgebaseerd programmeren |
Een anonieme functie is een functie die is gedeclareerd zonder een met name genoemde identifier om ernaar te verwijzen. Als zodanig is een anonieme functie meestal niet toegankelijk na de eerste creatie.
Normale functiedefinitie:
function hello() { alert('Hello world');}hello();
Anonieme functiedefinitie:
var anon = function() { alert('I am anonymous');}anon();
Een veelvoorkomend gebruik voor anonieme functies is als argument voor andere functies. Een ander veelgebruikt gebruik is als closure, waarvoor u ook het hoofdstuk Closures kunt raadplegen.
Gebruik als argument voor andere functies:
setTimeout(function() { alert('hello');}, 1000);
Hierboven wordt de anonieme functie doorgegeven aan setTimeout, die de functie na 1000 milliseconden zal uitvoeren.
Gebruik als closure:
(function() { alert('foo');}());
Ontleding van de bovenstaande anonieme statements:
- De omringende haakjes zijn een omhulsel voor de anonieme functie
- De achterliggende haakjes initiëren een aanroep naar de functie en kunnen argumenten bevatten
Een andere manier om het vorige voorbeeld te schrijven en hetzelfde resultaat te krijgen:
(function(message) { alert(message);}('foo'));
Een alternatieve weergave van het bovenstaande plaatst de initiërende accolades bij de omringende accolades en niet bij de functie zelf, wat verwarring veroorzaakt over waarom de omringende accolades überhaupt nodig zijn.
(function() { // …})();
Sommigen hebben zelfs hun toevlucht genomen tot het geven van de trailing braces techniek denigrerende namen, in een poging om mensen aan te moedigen om ze terug te verplaatsen binnen de omringende accolades tot waar ze de functie initieert, in plaats van de omringende accolades.
Een anonieme functie kan naar zichzelf verwijzen via de lokale variabele arguments.callee, wat handig is voor recursieve anonieme functies:
// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));
Argumenten.callee is echter afgeschreven in ECMAScript 5 Strict. De problemen met arguments.callee zijn dat het onmogelijk wordt om tail recursion te bereiken (een toekomstig plan voor JavaScript), en dat het resulteert in een andere deze waarde. In plaats van arguments.callee te gebruiken, kunt u in plaats daarvan named function expression gebruiken:
// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );
Een arrow function expression is vergelijkbaar met wat in andere programmeertalen bekend staat als lambda, geïntroduceerd in ECMAScript 6 in 2015. Het biedt een steno voor het maken van anonieme functies.
Voorbeelden:
- x => x + 1
- Een anonieme functie met één argument x die x + 1 retourneert.
- x => {return x + 1}
- Zoals hierboven, maar met een functielichaam.
- (x, y) => x + y
- Een pijlfunctie met 2 functies.
- (x, y) => {return x + y}
Links:
- Functies # De_pijlfunctieuitdrukking, ontwikkelaar.mozilla.org
- Functies/pijl functies, developer.mozilla.org