2016-03-29 9 views
5

studiere ich von diesem site und kam auf diese Frage und Antwort:Wie funktioniert die Rückgabe in Javascript, ohne dass eine Funktion aufgerufen wird?

eine Summe Methode schreiben, die richtig arbeiten, wenn sie unter Verwendung von entweder Syntax aufgerufen.

console.log(sum(2,3)); // Outputs 5 
console.log(sum(2)(3)); // Outputs 5 

// antworten

function sum(x) { 
    if (arguments.length == 2) { 
    return arguments[0] + arguments[1]; 
    } else { 
    return function(y) { return x + y; }; 
    } 
} 

ich den Code in das verstehen, wenn Aussage, aber nicht-Anweisung in der anderen, weil es einfach ist, eine Funktion zurück. Diese Funktion wird nicht mit einem '()' aufgerufen, also sehe ich das 2. Szenario von console.log(sum(2)(3)); Ich sehe nicht, warum es 5 zurückgibt. Ich kann nur sehen, dass es function(3) {return 2 + 3} zurückgibt, das einen Fehler werfen sollte.

+1

* "... Diese Funktion wird nicht mit einem '()' aufgerufen ..." * Es wird mit '()' aufgerufen. Es passiert einfach nach dem ersten '()'. 'sum (2) (3)' Das '(2)' ruft 'sum' auf, und das' (3) 'ruft alles auf, was von' sum (2) 'zurückgegeben wurde. –

Antwort

2

Die else-Anweisung wird eine Funktion mit dem x-Wert der Rückkehr aus dem ersten Aufruf verkapselt

Um zu erklären, es wird es bricht nach unten ein wenig

var fresult = sum(3); 

// right now fresult is a function that will add 3 
// to the variable you call fresult with 
// basically function(y){ return 3 + y; } 
var result = fresult(4); 

//result is 7 
console.log(result); 

Denken Sie daran, wie der Wert von x ist durch die Funktion erfasst werden, die zurückgegeben wird, die Sie dann

Diese Kapselung in der anonymen Funktion aufrufen, erstellt durch die Schließung erstellt wird in die Rückkehranweisung des anderen

Um mehr über Verschlüsse zu lernen, werfen Sie einen Blick auf this MDN Article about them, sie werden es viel besser erklären können, als ich könnte.

Sie haben tatsächlich ein Beispiel, das bei Ihnen sehr ähnlich ist, wo sie versuchen, das Konzept zu erklären, wie zu einer Fabrik ähnlich zu sein:

function makeAdder(x) { 
    return function(y) { 
    return x + y; 
    }; 
} 

var add5 = makeAdder(5); 
var add10 = makeAdder(10); 

console.log(add5(2)); // 7 
console.log(add10(2)); // 12 

Artikel sagen:

In diesem Beispiel Wir haben eine Funktion makeAdder (x) definiert, die ein einzelnes Argument x annimmt und eine neue Funktion zurückgibt. Die Funktion gibt ein einzelnes Argument y zurück und gibt die Summe von x und y zurück.

Im Wesentlichen ist makeAdder eine Funktion Factory - es erstellt Funktionen , die ihren Argument einen bestimmten Wert hinzufügen können. Im obigen Beispiel verwenden wir unsere Funktionsfabrik, um zwei neue Funktionen zu erstellen - eine, die ihr Argument 5 hinzufügt, und eine, die 10 hinzufügt.

add5 und add10 sind beide Schließungen. Sie teilen sich die gleiche Funktion Körper Definition, aber speichern Sie verschiedene Umgebungen. In ADD5 Umgebung, x ist 5. Soweit ADD10 betrifft, x 10.

ist Also, wenn Sie zu einem eher traditionellen Programmiersprache Fällen einige Gebrauch verwendet werden, die Sie für private Variablen wäre hätte die Wie das Erfassen von Variablen Werten in einer Schließung

3
sum(2) = function (y){ return 2 + y } 

Sie rufen diese Funktion mit (3)

2

Sie können in einer Variablen eine Funktion speichern.

Grundidee ist

var foo = function(y) { 
    return y 
}; 

Also, wenn wir betrachten,

console.log(sum(2)(3)); 

als

var part1 = sum(2); //aka part1 = function(y) { return 2 + y; }; 
var ans = part1(3); 
console.log(ans); 
1

else Teil geschrieben ist ein anonymous function die one Argument akzeptiert.

Bei sum(2)(3)

Es geht in andere Schleife, wo x = 2 seit seiner als sum(2) genannt, während (3) eine anonyme Funktion ohne Namen ist.

daher

return function(y) { return x + y; }; 

wird

return function(3) { return 2 + 3; }; 
1

Javascript ist ein bisschen anders als viele Sprachen. Funktionen können als Variablen weitergegeben werden. In Ihrem Fall ist das, was passiert, viel einfacher zu sehen, wenn es in die tatsächlich auftretenden Schritte unterteilt wird.

Erstens, da sum(2) nur einen Parameter hat, gehen wir zum else Block, den Sie bereits kennen. Was passiert, ist, dass wir eine Funktion zurückgeben, die x für die Variable ersetzt, die in sum(x) übergeben wurde. Also, was zurückgegeben wird, ist eine Funktion, die 2 + y zurückgibt.Dies ist, wie es aussehen würde, wenn wir wollten, es schreiben, auf seine eigene:

function(y) { 
    return 2 + y; 
} 

Der zweite Satz von Klammern in sum(2)(3) sagt im Grunde „die Funktion aufrufen, die von sum(2) und schicken Sie es den Parameter zurückgegeben wurde 3 . eine erweiterte Version der gesamten Operation

Hier ist im Grunde:

function sum(x) { 
    if (arguments.length == 2) { 
     return arguments[0] + arguments[1]; 
    } else { 
     return function(y) { return x + y; }; 
    } 
} 

var addTwo = sum(2); 

console.log(addTwo(3)); 

die kurze Version im Grunde überspringt nur eine separate Variable für das Ergebnis der sum(2) einer Schaffung d ruft stattdessen sofort die neue Funktion an.

Verwandte Themen