2017-01-23 28 views
0

以下の関数は、1小括弧内の引数を追加します。たとえば、addTogether(2,3) = 5およびaddTogether(2,"3") = undefinedを計算します。なぜ私のクロージャー機能は動作しませんか?

の計算に失敗し、"addTogether(...)は関数ではありません"というエラーが表示されます。クロージャ関数(return function(x))は、addTogether(2)(3)の2番目の引数を取っています。なぜそれがうまくいかないのか分かりません。

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(typeof arguments [0]!==" number "|| typeof arguments [1]!==" number ")'は既に 'addTogether(2)'に 'undefined'を返します。 – Xufox

+0

^引数が1つだけ渡された場合、 'typeof arguments [1]!==" number "は' true'です( 'typeof arguments [1]'は '' undefined ''を返すので)。 –

+0

「有害ではないが必要でない」というコメントは間違っています。それは必要ではなく、有害です。 – Barmar

答えて

1

あなたの関数がaddTogether(2)(3)のように仕事をしたい場合は、これはあなたの addTogetherがパラメータを取ると機能を返さなければならないことを意味します。 addTogether(2)この呼び出しは新しい関数を返し、2番目のパラメーターで返された関数を呼び出します。あなたのケースでは

あなたは

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

と2番目のパラメータはundefinedあるので、それは数ではなく、あなたの関数がundefinedを返すので、あなたtrue 1つの引数、第二typeof arguments[1] !== "number"戻って関数を呼び出すを比較。

あなたのコードでは、いくつかの条件も削除できます。上記の条件で既にチェックされているためです。

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

ありがとうございましたが、(return function(x))は新しい関数を返しませんでしたか?私はこの問題を解決する方法を混乱さしました –

+0

@Pythonnoobが編集されました –

1

if (typeof arguments[0] !== "number" || typeof arguments[1] !== "number")すでにundefinedを返すようにaddTogether(2)の原因となります。

ifステートメントを機能の最後に置くか、または||&&に変更すると、それが修正されます。

関連する問題