2016-05-01 8 views
3

私はJavaScriptでカリングを回避するように取り組んできましたが、渡された値の増分を返すためにカルト関数を複数回呼び出す方法がわかりません関数に追加します。ここでcurryを使用して別の値と等しい値になるまで

は私のコードです:

function curryFunc(x) { 
 
    var index = x; 
 
    var tmp; 
 

 
    return function(y) { 
 
    tmp = y; 
 
    index++; 
 

 
    if (index < tmp) { 
 
     console.log('index < y. index =',index); 
 
    } else { 
 
     console.log('end'); 
 
     return; 
 
    } 
 
    } 
 
}; 
 

 
var read = curryFunc(1); 
 

 
var test = read(3); 
 
test(); // 'index < y. index = 2' 
 
test(); // This returns an error: js:32 Uncaught TypeError: test is not a function

は、どのように私はそれがyに等しくなるまでtestxの増加を記録し続けるために得ることができますか?

+0

これはカレーを理解するのには関係ありません。カリー化された関数は、部分的にそれ自身を適用することができる関数です。それはかなりです。副作用とは関係がありません。あなたを混乱させるでしょう。 – elclanrs

+0

ありがとう!私は質問を更新します。私は、返された関数のパラメータが 'tmp'変数に格納されていて、後続の呼び出しごとにアクセスできると考えていました。なぜそうは思われないのか分かりません。 – Mdd

+0

あなたはカール以上に閉鎖について質問しているようです... – elclanrs

答えて

1

残念ながら、コードとその結果の出力と例外が正しく読み取られていません。

はここで実際に起こっているのです:

function curryFunc(x) { 
 
    var index = x; 
 
    var tmp; 
 

 
    return function(y) { 
 
    tmp = y; 
 
    index++; 
 

 
    if (index < tmp) { 
 
     console.log('index < y. index =',index); 
 
    } else { 
 
     console.log('end'); 
 
     return; 
 
    } 
 
    } 
 
}; 
 

 
var read = curryFunc(1); 
 

 
var test = read(3); // 'index < y. index = 2' 
 
test(); // This returns an error: js:32 Uncaught TypeError: test is not a function 
 
test(); // This never happens because of the exception above

あなたはおそらくやりたいことです:

function curryFunc(x) { 
 
    var index = x; 
 
    var tmp; 
 

 
    return function(y) { 
 
    tmp = y; 
 
    return function() { 
 
     index++; 
 

 
     if (index < tmp) { 
 
     console.log('index < y. index =',index); 
 
     } else { 
 
     console.log('end'); 
 
     return; 
 
     } 
 
    } 
 
    } 
 
}; 
 

 
var read = curryFunc(1); 
 

 
var test = read(3); 
 
test(); 
 
test();

そして、これも正確にカレー化しているわけではありません。

本当に、このようなコードを書くべきではありません。本当にカレーが必要な場合は、ライブラリを使用してください。

+0

ありがとう!あなたは絶対に正しいです、そして、私は値がどのようにコンソールに記録されていたのか私の間違いを信じることができません。例をありがとう、私はif文がそれに戻るために別の関数を持つ必要があると思っていましたが、私が完全にそれを把握していたかどうかは分かりませんでした。私はこのようなコードを書く必要はないと思っていますが、カリングは私が最近読んでいたものです。素晴らしい説明をありがとう! – Mdd

1

問題は、testは機能ではないということです。最初に印刷された行は、var test = read(3);行で印刷され、最初にtestを呼び出すとエラーが発生します。 read関数を繰り返し呼び出す必要があります。おそらく、あなたはこれをしたいと思っています:

var read = curryFunc(1); 
function test() { 
    read(3); 
} 
test(); 
test(); 
関連する問題