JavaScript/Anonyme funktioner
Præcedent: Funktioner | Index | Næste: Objektbaseret programmering |
En anonym funktion er en funktion, der blev erklæret uden nogen navngiven identifikator til at henvise til den. Som sådan er en anonym funktion normalt ikke tilgængelig efter dens oprindelige oprettelse.
Normal funktionsdefinition:
function hello() { alert('Hello world');}hello();
Anonym funktionsdefinition:
var anon = function() { alert('I am anonymous');}anon();
En almindelig anvendelse af anonyme funktioner er som argumenter til andre funktioner. En anden almindelig brug er som en closure, som du også kan læse mere om i kapitlet Closures.
Brug som argument til andre funktioner:
setTimeout(function() { alert('hello');}, 1000);
Ovenfor overgives den anonyme funktion til setTimeout, som vil udføre funktionen om 1000 millisekunder.
Brug som lukning:
(function() { alert('foo');}());
Opdeling af ovenstående anonyme udsagn:
- De omgivende parenteser er en indpakning for den anonyme funktion
- De afsluttende parenteser indleder et kald til funktionen og kan indeholde argumenter
En anden måde at skrive det foregående eksempel på og få det samme resultat:
(function(message) { alert(message);}('foo'));
En alternativ fremstilling af ovenstående placerer de indledende parenteser til de omgivende parenteser og ikke til selve funktionen, hvilket skaber forvirring om, hvorfor de omgivende parenteser overhovedet er nødvendige.
(function() { // …})();
Som nogle har endda tyet til at give de afsluttende parenteser teknikken nedsættende navne, i et forsøg på at tilskynde folk til at flytte dem tilbage inden for de omgivende parenteser til det sted, hvor de indleder funktionen, i stedet for de omgivende parenteser.
En anonym funktion kan henvise til sig selv via den lokale variabel arguments.callee, hvilket er nyttigt for rekursive anonyme funktioner:
// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));
Derimod er arguments.callee deprecated i ECMAScript 5 Strict. Problemerne med arguments.callee er, at det gør det umuligt at opnå hale-rekursion (en fremtidig plan for JavaScript), og det resulterer i en anden denne værdi. I stedet for at bruge arguments.callee kan du i stedet bruge navngivne funktionsudtryk:
// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );
Et pilefunktionsudtryk svarer til det, der i andre programmeringssprog kaldes lambda, og som blev indført i ECMAScript 6 i 2015. Det giver en stenografi til at oprette anonyme funktioner.
Eksempler:
- x => x + 1
- En anonym funktion med ét argument x, der returnerer x + 1.
- x => {return x + 1}
- Som ovenfor, men med en funktionskrop.
- (x, y) => x + y
- En 2-arg pilefunktion.
- (x, y) => {returner x + y}
Link:
- Funktioner # The_arrow funktionsudtryk, udvikler.mozilla.org
- Funktioner/Arrow-funktioner, developer.mozilla.org