JavaScript/Anonyymit funktiot

Previous: Functions Index Next: Oliopohjainen ohjelmointi

Anonyymi funktio on funktio, joka on julistettu ilman mitään nimettyä tunnusta, joka viittaisi siihen. Sellaisenaan anonyymiin funktioon ei yleensä pääse käsiksi sen alkuperäisen luomisen jälkeen.

Normaalin funktion määrittely:

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

Anonyymin funktion määrittely:

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

Yksi tavalliseksi käyttökohteeksi anonyymejä funktioita käytetään muiden funktioiden argumentteina. Toinen yleinen käyttö on sulkeutumisena, josta ks. myös luku Sulkeutuminen.

Käyttö argumenttina muille funktioille:

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

Yllä oleva anonyymi funktio välitetään funktiolle setTimeout, joka suorittaa funktion 1000 millisekunnin kuluttua.

Käyttö sulkuna:

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

Ylläolevan anonyymin lausekkeen erittely:

  • Ympäröivät sulkeet ovat anonyymin funktion kääre
  • Taakse jäävät sulkeet aloittavat kutsun funktiolle, ja ne voivat sisältää argumentteja

Muuten kirjoitetaan edellinen esimerkki, ja saavutetaan sama tulos:

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

Vaihtoehtoinen esitys edellä esitetystä sijoittaa aloittavat sulkeet ympäröiviin sulkeisiin eikä itse funktioon, mikä aiheuttaa hämmennystä siitä, miksi ympäröiviä sulkeita ylipäätään tarvitaan.

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

Jotkut ovat jopa turvautuneet antamaan perässä oleville hakasulkeille tekniikkaa halventavia nimiä yrittäessään rohkaista ihmisiä siirtämään ne takaisin ympäröivien hakasulkeiden sisälle sinne, missä ne aloittavat funktion, ympäröivien hakasulkeiden sijasta.

Anonyymi funktio voi viitata itseensä argumentit.callee-lokaalimuuttujan avulla, mikä on hyödyllistä rekursiivisia anonyymejä funktioita varten:

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

Mutta argumentit.callee on vanhentunut ECMAScript 5 Strictissä. Argumentit.callee:n ongelmat ovat, että se tekee mahdottomaksi pyrstörekursion toteuttamisen (tuleva suunnitelma JavaScriptille) ja johtaa erilaiseen this-arvoon. Argumentit.callee:n sijaan voit käyttää sen sijaan nimettyä funktiolauseketta:

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

Nuolifunktiolauseke muistuttaa sitä, mitä muissa ohjelmointikielissä kutsutaan lambdaksi, ja se otettiin käyttöön ECMAScript 6:ssa vuonna 2015. Se tarjoaa lyhennelmän anonyymien funktioiden luomiseen.

Esimerkkejä:

  • x => x + 1
    • Anonyymi funktio, jolla on yksi argumentti x ja joka palauttaa x + 1.
  • x => {palauttaa x + 1}
    • Kuten edellä, mutta funktiorungon kanssa.
  • (x, y) => x + y
    • Ensimmäinen 2-argumenttinen nuolifunktio.
  • (x, y) => {palauta x + y}

Linkit:

  • Funktiot # Nuolifunktion lausekkeen_nuolifunktio, kehittäjä.mozilla.org
  • Funktiot/Nuolifunktiot, developer.mozilla.org