Szukałem rozwiązania zagadki na kodewars i nie rozumiem, dlaczego to działa. Jak działa minus ()?
function makeNum(num, func) {
if (func === undefined) {
return num;
} else {
return func(num);
}
}
function three(func) {
return makeNum(3, func);
}
function eight(func) {
return makeNum(8, func);
}
function minus(right) {
return function(left) {
return left - right;
};
}
console.log(eight(minus(three()))); // will log out 5
javascript
TypeleveN
źródło
źródło
Odpowiedzi:
To trochę skomplikowane. :-)
console.log(eight(minus(three())));
jest uruchamiany od wewnątrz, więc prześledźmy to:three()
- dzwonimakeNum(3, undefined)
i zwraca to, co zwraca.makeNum(3, undefined)
zwraca3
, więc to jest wartość zwracana.minus(3)
- połączeniaminus
, przekazując3
jakoright
.minus
zwraca nową funkcję, która się zamykaright
.eight(...)
- wywołujemakeNum(8, fnFromMinus)
gdziefnFromMinus
jest funkcja, która została zwróconaminus(3)
.makeNum(8, fnFromMinus)
robifnFromMinus
, przechodząc8
jakoleft
.fnFromMinus
zwraca wynikleft - right
(należy pamiętać, żeright
to3
,fnFromMinus
zamknęła się nad nim).Ponieważ
8 - 3
jest5
to wynik końcowy5
, któryconsole.log
powraca.Oto wersja instrumentalna:
Pokaż fragment kodu
źródło
Nie jest to wcale takie skomplikowane, jeśli przejdziesz przez to krok po kroku. Pracujmy od wewnątrz. Powołanie:
bez parametru oznacza, że przekazujesz niezdefiniowaną wartość jako func. To jest tak samo jak powiedzenie:
Gdy makeNum widzi, że func jest niezdefiniowany, zwraca num, czyli 3.
Więc zredukowaliśmy to do:
Zobaczmy teraz, jak to zrobić
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:
Zobaczmy teraz, jak to ocenia. osiem jest wywoływane z parametrem func będącym tą funkcją:
Następnie przekazuje 8 i tę funkcję do makeNum, gdy mówi:
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:
powrót do ósmej funkcji. Osiem funkcji otrzymuje tę wartość, a następnie zwraca ją. Więc zredukowaliśmy to do:
który zostaje zalogowany w konsoli.
źródło
minus
zwraca nową funkcję dla każdego wywołania z przechwyconymi parametrami Po wywołaniu zwróconej funkcji może ona odwoływać się do parametrów przekazywanych podczas wywoływania, oprócz wszelkich przekazywanych do niej parametrów. Jest to jeden ze sposobów curry funkcji w JavaScript.źródło
Ten kod jest przykładem funkcji wyższego rzędu w funkcjonalnych językach programowania, takich jak js. Funkcje Javascript są traktowane jak obiekty i mogą być również przekazywane i zwracane.
minus
zwraca anonimową ( funkcja bez zdefiniowanej nazwy ) funkcję w zasadzie jako:Funkcja przekazana do
eight
jest wywoływana jako,func(8)
która następnie daje wynik jako5
źródło
Inny sposób na to spojrzeć - możesz przepisać tę linię:
Tak jak:
źródło