JavaScript/Funcții anonime
Precedent: Funcții | Index | Următor: Programarea bazată pe obiecte |
O funcție anonimă este o funcție care a fost declarată fără niciun identificator numit care să se refere la ea. Ca atare, o funcție anonimă nu este, de obicei, accesibilă după crearea sa inițială.
Definirea funcțiilor normale:
function hello() { alert('Hello world');}hello();
Definirea funcțiilor anonime:
var anon = function() { alert('I am anonymous');}anon();
O utilizare obișnuită pentru funcțiile anonime este ca argumente pentru alte funcții. O altă utilizare obișnuită este ca closure, pentru care vezi și capitolul Closures.
Utilizare ca argument pentru alte funcții:
setTimeout(function() { alert('hello');}, 1000);
Deasupra, funcția anonimă este trecută la setTimeout, care va executa funcția în 1000 de milisecunde.
Utilizarea ca o închidere:
(function() { alert('foo');}());
Descompunerea declarațiilor anonime de mai sus:
- Parantezele din jur sunt un înveliș pentru funcția anonimă
- Parantezele din spate inițiază un apel la funcție și pot conține argumente
O altă modalitate de a scrie exemplul anterior și de a obține același rezultat:
(function(message) { alert(message);}('foo'));
O reprezentare alternativă a exemplului de mai sus plasează parantezele de inițiere la parantezele înconjurătoare și nu la funcția în sine, ceea ce provoacă confuzie cu privire la motivul pentru care parantezele înconjurătoare sunt necesare în primul rând.
(function() { // …})();
Câțiva au recurs chiar și la atribuirea unor nume depreciative tehnicii bretelelor de urmărire, într-un efort de a încuraja oamenii să le mute înapoi în interiorul bretelelor înconjurătoare, acolo unde inițiază funcția, în loc de bretelele înconjurătoare.
O funcție anonimă se poate referi la ea însăși prin intermediul variabilei locale arguments.callee, utilă pentru funcțiile anonime recursive:
// returns the factorial of 10.alert((function(n) { return !(n > 1) ? 1 : arguments.callee(n - 1) * n;})(10));
Cu toate acestea, arguments.callee este depreciată în ECMAScript 5 Strict. Problemele cu arguments.callee sunt că face imposibilă realizarea recursivității cozii (un plan de viitor pentru JavaScript) și are ca rezultat o valoare diferită a acestei valori. În loc să folosiți arguments.callee, puteți utiliza în schimb expresia de funcție numită:
// returns the factorial of 10.alert( (function factorial(n) { return (n <= 1) ? 1 : factorial(n - 1) * n;})(10) );
O expresie de funcție săgeată este similară cu ceea ce în alte limbaje de programare este cunoscut sub numele de lambda, introdusă în ECMAScript 6 în 2015. Oferă o prescurtare pentru crearea de funcții anonime.
Exemple:
- x => x + 1
- O funcție anonimă cu un singur argument x care returnează x + 1.
- x => {returnează x + 1}
- Ca mai sus, dar cu un corp de funcție.
- (x, y) => x + y
- O funcție săgeată cu 2 argumente.
- (x, y) => {returnează x + y}
Links:
- Funcții # Expresia funcției săgeată, dezvoltator.mozilla.org
- Funcții/Funcții săgeată, developer.mozilla.org