2015-05-01 5 views
12

Ich war in einem Interview und ich habe alle Fragen richtig bis auf dieses hier.Wie kann ich eine Funktion für mod (3) (9) schreiben?

Die erste Frage, die dazu führten, war, wie schreiben Sie eine Funktion für mod(3,9) so dass es 0.

Ok gibt, einfach:

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

Danach war wie schreiben Sie die Funktion mod(3)(9), so dass es 0 zurückgibt?

Ich war ratlos ...

+4

Return eine Funktion zurückgibt. Sehen Sie sich Tutorials zu Funktionen höherer Ordnung an und currying. Ich denke du meinst 'mod (3) (9)' – elclanrs

+3

'mod ((3) (9))' --- ist kein syntaktisch gültiger JS. So ist es nicht möglich, eine Funktion zu schreiben, so dass ein solcher Aufruf zurückgegeben 0 – zerkms

+1

scheint wie eine ziemlich dumme Interview Frage –

Antwort

17

Sie schreiben eine Funktion, die eine Schließung zurückgibt.

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

 
alert(mod(3)(9));

Der alert Ausdruck ist die Abkürzung für:

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

Wenn Sie mod(3) nennen, es gibt eine Funktion, die ein Argument b und führt den Modul mit der gespeicherten Bindung von a, die 3 enthält. Wir können das dann genauso verwenden wie jede andere Funktion: Wir können sie einer Variablen zuweisen und sie dann als Funktion aufrufen, oder wir können sie einfach direkt aufrufen, indem wir ein weiteres Klammerpaar dahinter setzen.

+1

Ich mache weitere Forschungen zum Curry und die Beispiele sind alle zu tief. Ich möchte mit diesem einfachen Beispiel verstehen, was genau hier vor sich geht. Ich verstehe, dass es eine Funktion ist, die eine Funktion zurückgibt. Aber ich möchte verstehen, wie die aufgerufene Funktion funktioniert. mod (3) (9). Ich lese das als das Argument ist "3) (9" da Parameter sollen in Klammern eingeschlossen werden. Ich bekomme, dass mein Denken falsch ist. So ist es stattdessen Mod (3) zuerst, gibt Funktion (b), und 9 wird irgendwie als b übergeben (wie geht das?) dann gibt function (9) 9% 3 ... weiter im nächsten Kommentar – sjmartin

+0

der Teil, der mir fehlt, liest die Syntax korrekt Argument ist wirklich nicht "3) (9" also was ist es? Chained Funktionen? Mod (3) dann Mod (9)? Wie verwandelt sich die 9 in b? Danke. – sjmartin

+2

'var x = mod (3) (9) 'ist kurz für' var f = mod (3); var x = f (3); '. – Barmar

12

Zunächst einmal genau hinsehen, um die Nutzung dieser Konstruktion:

mod(3)(9); 

Sie können es in zwei Schritte aufgeteilt:

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

Von hier aus ist es offensichtlich, dass mod(3) allein muß eine Rückkehr neue Funktion, so dass es später erneut aufgerufen werden konnte. Diese neue Funktion muss den Wert beibehalten, der beim ersten Aufruf übergeben wurde. Dies ist der Schlüssel Teil: Sie diesen Wert im Verschluß gespeichert werden sollte (auch automatisch aufgrund der Natur der Verschlüsse gespeichert ist):

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

hier gute Illustration des Begriffs „closure“ kommt. Wenn jemand Sie fragt (zum Beispiel im Interview), können Sie sagen: closure ist die Funktion mit dem Bereich, in dem sie ursprünglich erstellt wurde. In der obigen Funktion hat die neue innere Funktion also immer internen Zugriff auf den äußeren Funktionsparameter x.

2

können Sie eine Funktion verwenden, die eine andere Funktion

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