2016-09-22 9 views
0

Aus irgendeinem Grund das Verfahren getTwo() innerhalb des PollClass nicht 2 aber undefined zurück. Wenn ich die return-Anweisung außerhalb der .forEach()-Schleife setze, wird ein Wert jedoch zurückgegeben.ES6 Klassenmethoden Rückkehr nichts innerhalb forEach Schleife

class Poll { 
    constructor(name) { 
    this.name = name; 
    this.nums = [1, 2, 3]; 
    } 

    getTwo() { 
    this.nums.forEach(num => { 
     if (num === 2) return num; 
    }) 
    } 
} 

const newPoll = new Poll('random name'); 
console.log(newPoll.getTwo()); // returns undefined, not 2 

Ist dies ein Problem mit der Schließung, ES 6, oder ein ganz anderes Problem?

+0

Es ist nicht klar, was Sie zurückkommen wollen, wenn 'this.nums' hat keine 2 oder wenn es hat mehr als nur eine 2. In jedem Fall solltest du besser '.some' anstelle von' forEach' verwenden. – raina77ow

+0

'forEach' wird nichts zurückgeben. Es ist keine 'for'-Schleife – Redu

+0

*" Ist das ein Problem mit Schließung, ES 6 oder einem ganz anderen Problem? "* Weder. Innere Funktionen können die äußere Funktion nicht dazu bringen, etwas zurückzugeben. –

Antwort

7

Eine Pfeilfunktion ist immer noch eine Funktion, und Sie kehren nur von der forEach-Callback-Funktion zurück, nicht von getTwo, sondern auch von der getTwo-Funktion.

Es ist nicht ganz klar, warum Sie eine Schleife auf diese Weise etwas zu überprüfen, verwenden würde, aber das Konzept wäre so etwas wie

getTwo() { 
    var n = 0; 
    this.nums.forEach(num => { 
     if (num === 2) n = num; 
    }) 
    return n; // returns something from getTwo() 
    } 
+2

Während dies funktioniert, ist es immer noch suboptimal, da es weiterschleifen wird, selbst nachdem eine "2" gefunden wurde. Abhängig von dem, was das OP das Verhalten sein will, wäre entweder eine traditionelle "for" -Schleife oder "find" bessere Optionen. –

+2

@JustinNiessner - sicher, 'Array.some',' Array.find', 'Array.indexOf', und eine Reihe anderer Array-Methoden könnten hier nützlich sein, aber es ist nicht klar, was das OP will, zum Beispiel' Array. einige gibt einen booleschen Wert zurück. – adeneo

+0

'return this.nums.indexOf (2)! == -1' wäre bei weitem das einfachste, wenn es nur überprüfen soll, ob diese Zahl im Array existiert. – adeneo

4

Als adeneo erwähnt sein, Sie von der getTwo Funktion zurückgeben müssen erreiche was du willst. Rückkehr aus dem Rückruf in forEach weitergegeben, unabhängig davon, ob es eine Pfeilfunktion oder nicht ist, nicht von forEach selbst zurück.

Alternativ zu forEach, können Sie find verwenden, die Sie in weniger Code schreiben und direkt zurück:

getTwo() { 
    return this.nums.find(num => num === 2); 
} 
+0

Ich wusste nichts über die Suchmethode, und dieser Code erspart mir Kopfschmerzen beim Versuch, einen Indexwert zu finden, also schätze ich Ihre Hilfe! – Rich

+0

Ich bin froh, dass ich geheiratet habe – nem035

Verwandte Themen