2009-11-21 6 views

Antwort

11

In diesem Fall können Sie diese Funktion werden angenommen (1) gibt eine Funktion, als Sie mit dem Argument 2.

Sehen Sie dieses Beispiel diese neue, anonyme Funktion aufrufen:

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' 

Hier Wir erstellen eine Funktion sum, die ein Argument benötigt. Innerhalb der Funktion sum erstellen wir eine , die ein anderes Argument verwendet. Diese anonyme Funktion wird als Ergebnis der Ausführung von sum zurückgegeben.

Beachten Sie, dass diese anonyme Funktion ein großartiges Beispiel dafür ist, was wir closure nennen. Eine Schließung ist eine Funktion, die den Kontext hält, in dem sie erstellt wurde. In diesem Fall behält es den Wert der Variablen a in sich, ebenso wie die Beispielfunktion add2. Wenn wir viele Verschlüsse schaffen, sind sie unabhängig wie Sie sehen können:

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

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

Darüber hinaus werden sie nicht „verwirrt“ erhalten, wenn Sie lokale Variablen ähnlich benannt haben:

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)); 

So, nachdem ein Rufen Sie an sum(2) oder multiply(2) das Ergebnis ist keine Zahl, noch eine Zeichenfolge, aber ist ein function. Dies ist eine Eigenschaft von functional languages - Sprachen, in denen Funktionen als Parameter übergeben und als Ergebnisse anderer Funktionen zurückgegeben werden können.

+0

+1 für großen Link zu Schließungen – bguiz

1

Wenn Ihre Funktion eine Funktion zurückgibt, können Sie diese auch aufrufen.

x = f(1)(2) 

entspricht:

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

Die Klammern geben Aufruf einer Funktion (Sie "Anruf" it). Wenn Sie

<anything>() 

haben, bedeutet es, dass der Wert von anything ein aufrufbare Wert ist. Stellen Sie sich die folgende Funktion:

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

Sie dann als add(1)(2) aufrufen kann, die gleich 3 würden Sie können dies natürlich erweitern, so viel wie Sie wollen.

+0

Keine Notwendigkeit, einen Namen für die Funktion zurückgegeben wird, btw zu geben. 'return function (n2)' wäre genauso gut und weniger tippen. –

+0

Ich weiß. Ich dachte, es wäre vielleicht besser, das vorliegende Problem nicht durch anonyme Funktionen zu verschleiern. – Svend

4

Sie haben eine Funktion, die eine Funktion zurückgibt:

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

Beim Aufruf f (1) Sie einen Verweis auf eine Funktion zurück.Sie können entweder speichern Sie die Referenz in einer Variablen und nennen es:

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

Oder Sie können es direkt anrufen:

var result = f(1)(2); 

Um eine Funktion zu erhalten, die eine Funktion gibt, die eine Funktion gibt, die eine Funktion zurückgibt Sie müssen nur den Vorgang wiederholen:

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

Neugierig auf den Downvote? Wenn Sie nicht erklären, was Sie nicht mögen, ist es ziemlich sinnlos ... – Guffa

Verwandte Themen