2015-05-01 8 views
12

Ero in un'intervista e ho ottenuto tutte le domande giuste tranne per questo.Come posso scrivere una funzione per mod (3) (9)?

La prima domanda che conduce ad esso era come si fa a scrivere una funzione per mod(3,9) in modo che restituisca 0.

Ok, facile:

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

Dopo che è stato come si fa a scrivere la funzione mod(3)(9) in modo che restituisca 0?

Sono stato perplesso ...

+4

di ritorno di una funzione. Controlla le esercitazioni su funzioni di ordine superiore e currying. Penso che tu intenda 'mod (3) (9)' – elclanrs

+3

'mod ((3) (9))' --- non è un JS sintatticamente valido. Quindi non è possibile scrivere una funzione in modo tale che una chiamata di tipo restituita '0' – zerkms

+1

sembra una domanda di intervista stupidata –

risposta

17

Si scrive una funzione che restituisce una chiusura.

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

 
alert(mod(3)(9));

Il alert espressione è l'abbreviazione di:

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

Quando si chiama mod(3), restituisce una funzione che prende un argomento b, ed esegue il modulo con il legame i salvati di a, che contiene 3. Possiamo quindi utilizzarlo nello stesso modo in cui useremmo qualsiasi altra funzione: possiamo assegnarla a una variabile e quindi chiamarla come una funzione, oppure possiamo chiamarla direttamente inserendo un'altra coppia di parentesi dopo di essa.

+1

Sto facendo ulteriori ricerche sul curry e gli esempi sono troppo profondi. Voglio capire cosa sta succedendo esattamente qui con questo semplice esempio. Capisco che è una funzione che restituisce una funzione. Ma voglio capire come funziona la funzione invocata. mod (3) (9). Sto leggendo questo come argomento "3) (9" dato che i parametri dovrebbero essere racchiusi tra parentesi.Vedo che il mio modo di pensare è sbagliato, così invece fa prima mod (3), restituisce la funzione (b), e 9 è in qualche modo passato come b? (come succede), quindi la funzione (9) restituisce il 9% 3 .... continua nel prossimo commento – sjmartin

+0

la parte che mi manca nella mia mente è la corretta lettura della sintassi. argomento in realtà non è "3) (9" allora che cos'è? funzioni concatenate? mod (3) poi mod (9)? Come si trasforma il 9 in b? Grazie – sjmartin

+2

'var x = mod (3) (9) 'è l'abbreviazione di' var f = mod (3); var x = f (3); '. – Barmar

12

Prima di tutto, guardare da vicino l'uso di questa costruzione:

mod(3)(9); 

È possibile dividere in due fasi:

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

Da qui è evidente che mod(3) da solo deve restituire un nuova funzione in modo che in seguito possa essere richiamata di nuovo. Questa nuova funzione deve conservare il valore passato con la prima chiamata. Questa è la parte fondamentale: è necessario memorizzare il valore nella chiusura (beh è memorizzato automaticamente a causa della natura delle chiusure):

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

Arriva buon esempio del termine "chiusura". Se qualcuno ti chiede (sul colloquio, per esempio) puoi dire: chiusura è la funzione con lo scopo in cui è stata originariamente creata. Quindi, nella funzione sopra, la nuova funzione interna ha sempre accesso interno al parametro funzione esterna x.

2

È possibile utilizzare una funzione che restituisce un'altra funzione

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