JavaScript/Anonyma funktioner

Förut: Funktioner Index Nästa: Objektbaserad programmering

En anonym funktion är en funktion som deklarerats utan någon namngiven identifierare för att hänvisa till den. Som sådan är en anonym funktion vanligtvis inte tillgänglig efter sin första skapelse.

Normal funktionsdefinition:

function hello() { alert('Hello world');}hello();

Anonym funktionsdefinition:

var anon = function() { alert('I am anonymous');}anon();

En vanlig användning för anonyma funktioner är som argument till andra funktioner. Ett annat vanligt användningsområde är som en closure, se även kapitlet Closures.

Användning som argument till andra funktioner:

setTimeout(function() { alert('hello');}, 1000);

Ovan skickas den anonyma funktionen till setTimeout, som kommer att exekvera funktionen om 1000 millisekunder.

Användning som closure:

(function() { alert('foo');}());

Uppdelning av ovanstående anonyma uttalanden:

  • Den omgivande parentesen är en omslagsform för den anonyma funktionen
  • Den avslutande parentesen initierar ett anrop till funktionen och kan innehålla argument

Ett annat sätt att skriva det föregående exemplet och få samma resultat:

(function(message) { alert(message);}('foo'));

En alternativ framställning av ovanstående placerar den inledande parentesen till den omgivande parentesen och inte till själva funktionen, vilket skapar förvirring om varför de omgivande parenteserna överhuvudtaget behövs.

(function() { // …})();

En del har till och med tillgripit att ge den avslutande hängslen tekniken nedsättande namn, i ett försök att uppmuntra folk att flytta tillbaka dem innanför de omgivande hängslen till den plats där de inleder funktionen, i stället för de omgivande hängslen.

En anonym funktion kan hänvisa till sig själv via den lokala variabeln arguments.callee, vilket är användbart för rekursiva anonyma funktioner:

// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));

Arguments.callee är dock föråldrad i ECMAScript 5 Strict. Problemen med arguments.callee är att det gör det omöjligt att uppnå svansrekursion (en framtida plan för JavaScript) och att det resulterar i ett annat this-värde. Istället för att använda arguments.callee kan du använda namngivna funktionsuttryck istället:

// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );

Ett pilfunktionsuttryck liknar det som i andra programmeringsspråk kallas lambda, som introducerades i ECMAScript 6 2015. Det ger en förkortning för att skapa anonyma funktioner.

Exempel:

  • x => x + 1
    • En anonym funktion med ett argument x som returnerar x + 1.
  • x => {return x + 1}
    • Som ovan, men med en funktionskropp.
  • (x, y) => x + y
    • En pilfunktion med 2arg.
  • (x, y) => {returnerar x + y}

Länkar:

  • Funktioner # Uttrycket för funktionen The_arrow, utvecklaren.mozilla.org
  • Funktioner/Arrow functions, developer.mozilla.org