Może łatwiej będzie Ci zrozumieć, gdy funkcja będzie nazwana:
function sum(a, b) {
return a + b;
}
function runMe(a, b, c) { /* kod */ }
console.log(
runMe(
sum, // <-- referencja do nazwanej funkcji `sum`
4,
5
)
);
Pod zmienną sum jest dostępna funkcja, która przyjmuje argumenty a oraz b, sumuje je i zwraca. W przypadku użycia funkcji anonimowej, do runMe przekazujesz (jako pierwszy argument) funkcję już bez nazwy:
function runMe(a, b, c) { /* kod */ }
console.log(
runMe(
function (a, b) { // <-- to samo co `sum` wcześniej, ale można wywołać tylko wewnątrz `runMe`
return a + b;
},
4,
5
)
);
Z perspektywy funkcji runMe, która odbiera funkcję jako argument (w tym kontekście określaną jako callback), parametr a jest po prostu funkcją, którą można wywołać lub przekazać ją gdzieś dalej. Samo przekazanej funkcji nazwanej lub anonimowej ma mniej istotne znaczenie - nazwane funkcje częściej są łatwiejsze w ewentualnym odnalezieniu ich w callstacku (w razie wystąpienia błędu) i można je wywołać (często korzystając z rekursji) w scopie, gdzie zostały zadeklarowane (w przeciwieństwie do anonimowej, która nazwę otrzymuje dopiero jako parametr tam, gdzie zostanie przekazana; ewentualnie gdy jest to function expression). Większe znaczenie może mieć przekazanie funkcji strzałkowej VS nie-strzałkowej ("normalnej"), bo wtedy różnice są bardziej istotne (m.in. inaczej działa this, nie można dowiązać argumentów, nie można wywołać jako konstruktor).
Jeśli masz jakieś dodatkowe pytania, to śmiało.