2009-11-21 12 views

risposta

11

In questo caso si sta supponendo che la funzione (1) restituisce una funzione, che si sta chiamando questa nuova, funzione anonima con un argomento di 2.

Vedere questo esempio:

function sum(a) { 
    return function(b) { 
     return a+b; 
    } 
} 

// Usage: 
window.alert(sum(5)(3));   // shows 8 

var add2 = sum(2); 
window.alert(add2(5));   // shows 7 
window.alert(typeof(add2));  // shows 'function' 

Qui creiamo una funzione sum che accetta un argomento. All'interno della funzione sum, creiamo uno che accetta un altro argomento. Questa funzione anonima viene restituita come risultato dell'esecuzione di sum.

Si noti che questa funzione anonima è un ottimo esempio di ciò che chiamiamo closure. Una chiusura è una funzione che mantiene il contesto in cui è stata creata. In questo caso, manterrà il valore della variabile a al suo interno, così come la funzione di esempio add2. Se creiamo tante chiusure, sono indipendenti, come potete vedere:

var add3 = sum(3); 
var add4 = sum(4); 

window.alert(add3(3)); // shows 6 
window.alert(add4(3)); // shows 7 

Inoltre, essi non otterranno "confuso" se avete un nome simile variabili locali:

var a = "Hello, world"; 

function multiply(a) { 
    return function(b) { 
     return a * b; 
    } 
} 

window.alert(multiply(6)(7)); // shows 42 

var twoTimes = multiply(2); 
window.alert(typeof(twoTimes)); 
window.alert(twoTimes(5)); 

Così, dopo un chiama a sum(2) o multiply(2) il risultato non è un numero, né una stringa, ma è un function. Questa è una caratteristica di functional languages - lingue in cui le funzioni possono essere passate come parametri e restituite come risultati di altre funzioni.

+0

+1 per la grande collegamento per chiusure – bguiz

1

Se la funzione restituisce una funzione, è possibile chiamare anche questa.

x = f(1)(2) 

è equivalente a:

f2 = f(1) 
x = f2(2) 
1

La parentesi indicano invocazione di una funzione (si "chiamata" di esso). Se si dispone di

<anything>() 

Ciò significa che il valore di anything è un valore richiamabile. Immaginate la seguente funzione:

function add(n1) { 
    return function add_second(n2) { 
     return n1+n2 
    } 
} 

È quindi possibile richiamare come add(1)(2) che sarebbe uguale a 3. È naturalmente possibile estendere questo tanto quanto si desidera.

+0

Non c'è bisogno di dare un nome alla funzione da restituire, btw. 'return function (n2)' sarebbe altrettanto buono, e meno digitando, anche. –

+0

Lo so. Ho pensato che forse sarebbe stato meglio non confondere il problema usando anche funzioni anonime. – Svend

4

di avere una funzione che restituisce una funzione:

function f(n) { 
    return function(x) { 
    return n + x; 
    }; 
} 

Quando si chiama f (1) si ottiene un riferimento a una funzione di back.È possibile memorizzare il riferimento in una variabile e chiamare:

var fx = f(1); 
var result = fx(2); 

Oppure si può chiamare direttamente:

var result = f(1)(2); 

Per ottenere una funzione che restituisce una funzione che restituisce una funzione che restituisce una funzione , basta ripetere il processo:

function f(n) { 
    return function(x) { 
    return function(y) { 
     return function(z) { 
     return n + x + y + z; 
     } 
    } 
    }; 
} 
+1

Curioso per il downvote? Se non spieghi cosa non ti piace, è piuttosto inutile ... – Guffa

Problemi correlati