Nie jest to wcale takie skomplikowane, jeśli przejdziesz przez to krok po kroku. Pracujmy od wewnątrz. Powołanie:
three()
bez parametru oznacza, że przekazujesz niezdefiniowaną wartość jako func. To jest tak samo jak powiedzenie:
makeNum(3, undefined)
Gdy makeNum widzi, że func jest niezdefiniowany, zwraca num, czyli 3.
Więc zredukowaliśmy to do:
eight(minus(3))
Zobaczmy teraz, jak to zrobić
minus(3)
ocenia. minus widzi, że podany parametr to 3, więc zwraca funkcję, która może zaakceptować parametr „left” i odjąć 3, które już podaliśmy. NIE wykonuje się. Po prostu tam siedzi i czeka na wywołanie z parametrem „left”, aby mógł odjąć 3 od niego.
Więc zredukowaliśmy to do:
eight(function(left){
return left - 3;
})
Zobaczmy teraz, jak to ocenia. osiem jest wywoływane z parametrem func będącym tą funkcją:
function(left){
return left - 3;
}
Następnie przekazuje 8 i tę funkcję do makeNum, gdy mówi:
makeNum(8, func)
makeNum następnie widzi, że func został dostarczony (i dlatego nie jest niezdefiniowany) i zwraca func (num) z powrotem do ósmej funkcji, która jest taka sama jak przekazywanie:
8 - 3
powrót do ósmej funkcji. Osiem funkcji otrzymuje tę wartość, a następnie zwraca ją. Więc zredukowaliśmy to do:
5
który zostaje zalogowany w konsoli.