2017-03-05 2 views
3

Arbeiten an Eloquent Javascript Kapitel über hohe Auftragsfunktionen, kam ich accross diesem Beispiel:geschweiften Klammern um for-Schleife verändert Ausgabe

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) 
    current = combine(current, array[i]); 
    return current; 
} 

console.log(reduce([1, 2, 3, 4], function(a, b) { 
    return a + b; 
}, 0)); 
// → 10 

die, wenn sie die for Schleife neu geschrieben sind, was ich dachte waren optional, geschweifte Klammern, wie:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
    } 
} 

console.log(reduce([1, 2, 3, 4], function(a, b) { 
    return a + b; 
}, 0)); 
// → 1 

das Ergebnis nur 1 statt der erwarteten 10 ist, was die Klammern hier tun werden, um die Ausgabe zu ändern?

+1

Die geschweiften Klammern setzen den 'return current;' run ** in ** den Schleifenkörper, sodass Sie die Funktion bei der ersten Iteration beenden. Ohne die Klammern ist der 'Rückstrom;' ** nach ** dem Schleifenkörper. –

Antwort

5

Sie müssen die return-Anweisung außerhalb des Blocks für die for-Schleife verschieben, da die return-Anweisung die Funktion und die Schleife sofort beendet.

for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
} 
return current; 

function reduce(array, combine, start) { 
 
    var current = start; 
 
    for (var i = 0; i < array.length; i++) { 
 
     current = combine(current, array[i]); 
 
    } 
 
    return current; 
 
} 
 

 
console.log(reduce([1, 2, 3, 4], function(a, b) { 
 
    return a + b; 
 
}, 0));

6

Die geschweiften Klammern sind gerade dabei, wie Sie von ihnen fragte:, weil Sie die return Anweisung in der for Schleife enthalten:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
    } 
} 

die Schleife endet kurz vor, was beabsichtigt war, weil die Rückkehr der Schleife beendet wird, tatsächlich Funktion, wenn ein Wert zurückgegeben wird, und so nur der Wert des ersten Elements des Arrays: 1 wird auf var current gefaltet und gibt 1 aus. Wohingegen:

function reduce(array, combine, start) { 
    var current = start; 
    for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    } 
    return current; 
} 

gibt die erwartete Ausgabe: 10 weil die for faltet alle Array-Elemente vor Wert zurückkehrt.

3

Dieser Code führt die Schleife einmal und kehrt gleich nach dem ersten Zyklus:

for (var i = 0; i < array.length; i++) { 
    current = combine(current, array[i]); 
    return current; 
} 

Hier haben wir nach Schleife zurückkehren beendet Radsport:

for (var i = 0; i < array.length; i++) 
    current = combine(current, array[i]); 
return current; 
Verwandte Themen