2017-01-23 5 views
0

Die folgende Funktion fügt Argumente innerhalb von 1 paranthesis fine hinzu. Zum Beispiel berechnet es addTogether(2,3) = 5 und addTogether(2,"3") = undefined.Warum funktioniert meine Schließfunktion nicht?

Es schlägt jedoch addTogether(2)(3) = 5 nicht zu berechnen, stattdessen gibt mir der Fehler "addTogether (...) ist keine Funktion". Die Closure-Funktion (return function(x)) soll in das zweite Argument in addTogether(2)(3) eingehen, und ich weiß nicht, warum es nicht funktioniert.

function addTogether() { 
 

 
    if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number") { 
 
    return undefined; 
 
    } //not harmful but not necessary 
 
    var sum = 0; 
 
    var num = arguments[0]; 
 

 
    if (arguments.length === 1) { 
 
    //if only 1 argument in the original function... 
 
    if (typeof arguments[0] !== "number") { 
 
     return undefined; 
 
     //returns undefined if arguments[0] isnt a number 
 
    } 
 

 
    return function(x) { 
 
     if (typeof arguments[0] !== "number") { 
 
     return undefined; 
 
     //in the closure/2nd function, if first argument isnt a number then no sum will be provided 
 
     } else { 
 
     sum = num + x; //x = second given argument 
 
     return sum; 
 
     } 
 
    }; 
 

 
    } 
 

 
    if (typeof arguments[0] === "number" && typeof arguments[1] === "number") { 
 

 
    for (var x = 0; x < arguments.length; x++) { 
 
     if (typeof arguments[x] === "number") { 
 
     sum += arguments[x]; 
 
     //add the argument[0] and [1] if both are number types, not string or array types or any other types 
 
     } else { 
 
     sum = undefined; 
 
     } 
 
    } 
 

 
    return sum; 
 

 
    } 
 
    // the above "if" statement is rsponsible for achieving addTogether(2,3) = 5; 
 

 
} 
 

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

+4

'if (typofarguments [0]! ==" number "|| typofarguments [1]! ==" number ")' bewirkt bereits 'addTogether (2)', um 'undefined' zurückzugeben. – Xufox

+0

^Wenn Sie nur ein einzelnes Argument übergeben, ist 'typeof arguments [1]! ==" number "' 'true' (weil' typeof arguments [1] ''' undefined' 'zurückgibt). –

+0

Der Kommentar "Nicht schädlich aber nicht notwendig" ist falsch. Es ist nicht notwendig, und es ist schädlich. – Barmar

Antwort

1

Wenn Sie Ihre Funktion wollen wie addTogether(2)(3) arbeiten, bedeutet dies, dass Ihre addTogether muss einen Parameter übernehmen und eine Funktion zurück. addTogether(2) Dieser Aufruf gibt eine neue Funktion zurück und ruft dann die zurückgegebene Funktion mit dem zweiten Parameter auf.

In Ihrem Fall, wenn Sie

if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number") 

und rufen Sie die Funktion mit einem Argument, die zweite typeof arguments[1] !== "number" kehren Sie true vergleichen, da der zweite Parameter undefined ist, so dass es nicht eine Nummer und Ihre Funktion gibt ist undefined .

Und in Ihrem Code können Sie auch einige Bedingungen entfernen. Weil die obige Bedingung sie bereits überprüft.

function addTogether() { 
 

 
    if (typeof arguments[0] !== "number") { 
 
    return undefined; 
 
    } 
 
    var sum = 0; 
 
    var num = arguments[0]; 
 

 
    if (arguments.length === 1) { 
 

 
    return function(x) { 
 
     if (typeof arguments[0] !== "number") { 
 
     return undefined; 
 
     
 
     } else { 
 
     sum = num + x; 
 
     return sum; 
 
     } 
 
    }; 
 

 
    } 
 

 
    if (typeof arguments[0] === "number" && typeof arguments[1] === "number") { 
 

 
    for (var x = 0; x < arguments.length; x++) { 
 
     if (typeof arguments[x] === "number") { 
 
     sum += arguments[x]; 
 
     
 
     } else { 
 
     sum = undefined; 
 
     } 
 
    } 
 

 
    return sum; 
 

 
    } 
 
    
 
} 
 

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

+2

Vielen Dank für die Hilfe, aber nicht die (Return-Funktion (x)) diese neue Funktion zurückgeben? Ich bin verwirrt, wie man das repariert –

+0

@Pythonnoob Edited –

1

if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number") bereits verursacht addTogether(2)undefined zurückzukehren.

Platzieren Sie diese if Anweisung am Ende der Funktion oder drehen, dass || in eine && behebt es.

Verwandte Themen