2015-05-01 13 views
12

Byłem w wywiadzie i dostałem wszystkie pytania, z wyjątkiem tego.Jak mogę napisać funkcję mod (3) (9)?

Pierwsze pytanie prowadzące do niej był jak można napisać funkcję do mod(3,9) tak, że zwraca 0.

Ok, proste:

function mod(a,b){ 
    return b%a; 
} 

Potem było jak piszesz funkcji mod(3)(9) dzięki czemu zwraca 0?

byłem zakłopotany ...

+4

zwróci funkcja. Sprawdź samouczki dotyczące funkcji wyższego rzędu i curry. Myślę, że masz na myśli 'mod (3) (9)' – elclanrs

+3

'mod ((3) (9)) --- --- nie jest poprawnym składniowo JS. Tak więc nie można napisać funkcji, aby takie wywołanie zwróciło '0' – zerkms

+1

wydaje się być dość głupie pytanie wywiadowcze –

Odpowiedz

17

napisać funkcję, która zwraca zamknięcia.

function mod(a) { 
 
    return function(b) { 
 
    return b % a; 
 
    } 
 
} 
 

 
alert(mod(3)(9));

Wyrażenie alert jest skrótem od:

var tempfun = mod(3); 
alert(tempfun(9)); 

Po wywołaniu mod(3), zwraca funkcję, która przyjmuje argument b i wykonuje moduł z zapamiętanych wiążący z a, która zawiera 3. Możemy wtedy użyć tego w taki sam sposób, w jaki użyjemy jakiejkolwiek innej funkcji: możemy przypisać ją do zmiennej, a następnie wywołać ją jako funkcję, lub możemy po prostu wywołać ją bezpośrednio, umieszczając po niej kolejną parę nawiasów.

+1

Robię dalsze badania nad curry, a przykłady są zbyt głębokie. Chcę zrozumieć, co się tutaj dzieje z tym prostym przykładem. Rozumiem, że jest to funkcja zwracająca funkcję. Ale chcę zrozumieć, jak działa wywoływana funkcja. mod (3) (9). Czytałem to jako argument "3) (9", ponieważ parametry mają być zawijane w nawiasach, rozumiem, że moje myślenie jest błędne, tak samo jest w przypadku mod (3) najpierw, zwraca funkcję (b), i 9 jest w jakiś sposób przekazywane jako b (jak to się dzieje), wtedy funkcja (9) zwraca 9% 3 ... kontynuacja w następnym komentarzu – sjmartin

+0

Część, której mi brakuje w moim umyśle, to prawidłowe odczytywanie składni. Argument naprawdę nie jest "3) (9" więc co to jest? łańcuchowe funkcje? mod (3) to mod (9)? Jak zmienia się 9 w b? Dziękuję – sjmartin

+2

'var x = mod (3) (9) 'jest skrótem od' var f = mod (3), var x = f (3); '. – Barmar

12

Przede wszystkim przyjrzeć wykorzystaniem tej konstrukcji:

mod(3)(9); 

Można podzielić go na dwa etapy:

var fn = mod(3); 
fn(9); 

Stąd jest to oczywiste, że mod(3) sam musi zwrócić nowa funkcja, aby później można było wywołać ją ponownie. Ta nowa funkcja musi zachować wartość przekazaną przy pierwszym wywołaniu. Jest to kluczowa część: należy zapisać tę wartość w zamknięciu (dobrze jest zapisany automatycznie ze względu na charakter zamknięć):

function mod(x) { 
    return function(y) { 
     return y % x; 
    }; 
} 

Nadchodzi dobrą ilustracją pojęcia „zamknięcia”. Jeśli ktoś cię pyta (na przykład w wywiadzie), możesz powiedzieć: zamknięcie to funkcja z zakresem, w którym została oryginalnie utworzona. Tak więc w funkcji powyżej, nowa wewnętrzna funkcja zawsze ma wewnętrzny dostęp do zewnętrznego parametru funkcji x.

2

Można użyć funkcji, która zwraca inną funkcję

function mod(a) { 
    return function(b) { 
     return b % a; 
    } 
} 
Powiązane problemy