2017-05-22 2 views
0

Ich verwende getFooBar(x, y) in einer anderen Funktion und möchte foo() oder bar() je nach der Bedingung ausführen. Wenn keiner von ihnen true ist: Nichts tun.Wie vermeide ich, dass meine Rückkehrfunktion "undefined" zurückgibt, wenn keine Bedingungen erfüllt sind

Aber JS mag das nicht. Es wird immer etwas zurückgeben und in diesem Fall ist es undefined.

Kann dies verhindert werden?

getFooBar(x, y) { 

    if (x > y) { 
     return foo(); 
    } 
    if (y > x) { 
     return bar(); 
    } 
} 


foo() { 
    // do stuff. 
} 

bar() { 
    // do some other stuff. 
} 
+1

Wenn nichts zurückgegeben explizit wird es undefined zurück. – brk

+0

Warum willst du nicht, dass es unbestimmt zurückkommt? –

+0

Da wir alle zusammen mit wertvollen Antworten beantwortet haben, habe ich euch Jungs – mnemosdev

Antwort

1

Wenn Sie nicht undefined wollen, müssen Sie sicherstellen, dass Ihre Funktion etwas ganz gleich wieder, wie es aufgerufen wird.

Sie müssen auf die Existenz der Argumente testen. Sie können dies tun, indem Sie die integrierte arguments Objekt length Eigenschaft überprüfen.

Sie sollten auch überprüfen, dass die Argumente vom richtigen Typ sind (ich nehme an, dass Sie Zahlen denken).

Übrigens, Ihre Logik gibt nicht an, was passieren sollte, wenn x === y, also, wenn Sie für diese Bedingung überprüfen, wird die Funktion nichts zurück und dann, wenn Sie versuchen, den Rückgabewert zu verwenden, erhalten Sie undefined.

function getFooBar(x, y) { 
 
    // Make sure both arguments were passed 
 
    if(arguments.length === 2 && typeof x === "number" && typeof y === "number"){  
 
     if (x > y) { 
 
     return foo(); 
 
     } 
 
    
 
     if (y > x) { 
 
     return bar(); 
 
     } 
 
    } else { 
 
     // One or both arguments are missing. 
 
     // You can do whatever you like here. 
 
     // In this example, it will return a failure message, 
 
     // but, you could simply use return with no value. 
 
     return "invalid function call"; 
 
    } 
 
} 
 

 

 
function foo() { 
 
    // do stuff. 
 
    return "foo"; 
 
} 
 

 
function bar() { 
 
    // do some other stuff. 
 
    return "bar"; 
 
} 
 

 
console.log(getFooBar()); 
 
console.log(getFooBar("Tuesday", "Purple")); 
 
console.log(getFooBar(5,5)); // No condition tests for equal arguments, so no value is returned 
 

 
// This time we'll check to see if there is a value to work with before assuming it's there: 
 
var result = getFooBar(5,5); 
 
if(result){ 
 
    console.log(result); 
 
} else { 
 
    console.log("getFooBar(5,5) doesn't return a value."); 
 
} 
 

 
console.log(getFooBar(5,10)); 
 
console.log(getFooBar(10,5));

+0

In diesem Fall gibt es eine Zeichenfolge zurück. Also ist es nicht möglich, einfach nichts zurückzugeben? – Hevar

+0

@Hevar Es ist möglich, dass eine Funktion keinen Wert zurückgibt, aber das Problem, "undefiniert" zu erhalten, kommt tatsächlich von außerhalb der Funktion, wenn Sie versuchen, den Rückgabewert woanders zu verwenden. Wenn die Funktion niemals einen Wert zurückgibt und Sie dann versuchen, den Rückgabewert zu verwenden, werden Sie "undefiniert" erhalten. In diesen Fällen müssen Sie den Rückgabewert überprüfen, bevor Sie ihn verwenden. –

+0

@Hevar Siehe meine aktualisierte Antwort (speziell wenn 'x === y'), um zu sehen, wie kein Wert zurückgegeben wird und wie dies behandelt werden soll. –

0

Sie können entweder eine leere return Anweisung hinzufügen oder einen falsy Wert zurück wie null, 0, undefined oder alles, was Sie wollen. Auch wenn es undefined zurückgibt, können Sie den zurückgegebenen undefinierten Wert trotzdem abfangen und etwas damit tun, genau wie nicht zurückgegebene Funktionen. Sie entscheiden sich entweder dafür, einen undefined Rückgabewert zu akzeptieren und mit ihm zu arbeiten, oder schreiben einen eigenen Rückgabewert, egal welchen Typs.

getFooBar(x, y) { 

    if (x > y) { 
     return foo(); 
    } 
    if (y > x) { 
     return bar(); 
    } 

    return "foobar"; 
} 


foo() { 
    // do stuff. 
} 

bar() { 
    // do some other stuff. 
} 
+0

aufgefrischt Auch in diesem Fall wird es undefined zurückkehren. Überprüfen Sie diese https://jsfiddle.net/apLnvu3c/ – brk

+0

das ist genau der Punkt, Sie akzeptieren entweder undefined als Rückgabewert oder Sie geben selbst einen Rückgabewert :) – mnemosdev

+0

In diesem Fall gibt es eine Zeichenfolge zurück. Also ist es nicht möglich, einfach nichts zurückzugeben? – Hevar

Verwandte Themen