2015-05-03 19 views
7

qualcuno può spiegarmi cosa sta succedendo nel seguente codice. La funzione sta ricevendo n come parametro, quindi da dove viene il m? L'intero codice è confuso ... se qualcuno può spiegare?Funzioni javascript di ordine superiore

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

risposta

7

Questo presenta una tecnica di programmazione funzionale denominata currying. (relativo anche a partial function appliction)

Più di > in genere richiede 2 argomenti (uno a sinistra e uno a destra). Questo è un modo per nutrire uno alla volta.

Potrebbe essere più facile da vedere che cosa sta accadendo se lo si chiama in linea:

greaterThan(10)(11); 

Come si può vedere dall'esempio precedente, la 10 viene passato in per il parametro n e poi il 11 viene passato in per il parametro m.

La prima applicazione che passa il 10 emette una funzione simile al seguente:

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

Questa è la prima applicazione nell'applicazione parziale.

Da lì è facile vedere come viene passato il 11 per ottenere il risultato finale.

Così, di scomporlo:

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

Grazie ormai molto chiaro .. – whatever

6

m è 11, passata durante la seconda chiamata.

Quando si chiama greaterThan(10), restituisce una nuova funzione che assomiglia:

function(m) { 
    return m > 10; 
} 

che viene quindi salvato come greaterThan10. Questo è chiamato currying.

1

Si hanno due funzioni lì.

Il n proviene da quando viene chiamata la prima funzione.

Il m deriva da quando viene richiamata la seconda funzione (che è il valore di ritorno della prima funzione).

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

Grazie !!!!!!! – whatever

2

greaterThan è una funzione che restituisce un'altra funzione, di conseguenza, è un m paraterer di quella funzione restituito. Così nel codice: var greaterThan10 = function(m) { return m > 10; };

e console.log(greaterThan10(11)); è lo stesso di console.log(11 > 10);

+1

Grazie !! è stato un vero aiuto .. – whatever

2

quando si chiama la funzione greaterThan restituisce un'altra funzione, ma non un numero di float. La funzione interna conosce n perché all'interno della funzione greaterThan.

Perché funzione wrapper restituisce un'altra funzione è possibile chiamare secondo uno come questo

var result = greaterThan(10)(11); 

primo argomento 10 saranno utilizzati per la funzione wrapper, ma risultato è la funzione in modo da poter passare immediatamente gli argomenti per la funzione interna. questo è possibile solo se si dispone di return function(){...}

si può provare qualcosa di simile

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