2015-05-03 14 views
7

kann mir jemand erklären, was im folgenden Code vor sich geht. Die Funktion empfängt n als Parameter, also woher kommt die m? Der ganze Code ist verwirrend .. wenn jemand das erklären kann?JavaScript-Funktionen höherer Ordnung

function greaterThan(n) { 
    return function(m) { return m > n; }; 
    } 
    var greaterThan10 = greaterThan(10); 
    console.log(greaterThan10(11)); 
    // → true 

Antwort

7

Dies zeigt eine funktionale Programmiertechnik namens currying. (verwandt auch zu partial function appliction)

Größer als > nimmt normalerweise 2 Argumente (eins links und eins rechts). Dies ist eine Möglichkeit, einzeln zu füttern.

Es könnte einfacher sein, zu sehen, was passiert, wenn Sie es inline nennen:

greaterThan(10)(11); 

Wie Sie aus dem obigen Beispiel sehen können, die 10 wird für die n Parameter übergeben und dann wird die 11 weitergegeben in für den m Parameter. Dies ist die erste Anwendung in der Teilanmeldung

function(m) { return m > 10; }; 

:

Die erste Anwendung, die die 10 gibt gibt eine Funktion, die wie folgt aussieht.

Von dort ist es einfach zu sehen, wie die 11 übergeben wird, um das Endergebnis zu erhalten.

Also, um es zu brechen:

function greaterThan(n) { 
    return function(m) { return m > n; }; 
} 

//var greaterThan10 = greaterThan(10); -- is equivalent to: 
var greaterThan10 = function(m) { return m > 10; }; 

console.log(greaterThan10(11)); //--> true 
+0

Dank jetzt sehr deutlich wieder .. – whatever

6

m11 ist, während der zweite Anruf eingeleitet.

Wenn Sie greaterThan(10) aufrufen, gibt es eine neue Funktion, die wie folgt aussieht:

function(m) { 
    return m > 10; 
} 

, die dann als greaterThan10 gespeichert wird. Dies wird currying genannt.

1

Sie haben zwei Funktionen.

Die n kommt aus, wenn die erste Funktion aufgerufen wird.

Die m kommt aus, wenn die zweite Funktion (der Rückgabewert der ersten Funktion) aufgerufen wird.

greaterThan10 = greaterThan(10); 
//       ^^ n 
greaterThan10(11)) 
// ^^ returned function 
//   ^^ m 
+0

Thank you !!!!!!! – whatever

2

greaterThan eine Funktion ist, die eine andere Funktion als ein Ergebnis zurückgibt, ist eine m paraterer dieser Funktion zurückgegeben. Also in Ihrem Code: var greaterThan10 = function(m) { return m > 10; };

und console.log(greaterThan10(11)); die gleiche wie console.log(11 > 10);

+1

Danke !! das war eine echte Hilfe .. – whatever

2

ist, wenn rufen Sie Funktion greaterThan es eine andere Funktion gibt aber nicht eine Reihe von Schwimmer. Innere Funktion weiß über n, weil es innerhalb der Funktion greaterThan.

Da Wrapper-Funktion eine andere Funktion zurückgibt, kann man eine zweite nennen wie dieses

var result = greaterThan(10)(11); 

erste Argument 10 für Wrapper-Funktion verwendet werden, aber Ergebnisfunktion ist, so dass Sie Argumente für die innere Funktion sofort passieren kann. dies nur möglich ist, wenn Sie return function(){...}

haben Sie so etwas wie

var a = function (x){ 
     return function(y){ 
      return function(z){ 
       return x*y*z; 
      } 
      } 
     } 
var result = a(5)(3)(8);