2017-03-09 5 views
0

私はJSのダグラス・クロークフォーズの講義に従っています。彼の演習の1つは、 "1つの引数をとり、引数を返す関数を返す関数を書く"ことです。次の質問は、 "2つの呼び出しから追加する関数を書く"です。なぜconsole.logは値の代わりに関数を貼り付けますか?

私は両方に答えを得ました。私が得意ではないのは、なぜコンソールにポストしないのですか、そしてもう一方はコンソールにポストしないということです。ここに私が意味するものがあります。私はこれに変更した場合、それはコンソールに4を投稿しますしかし

function(){ 
    return x; 
} 

(:

function retFunc(x){ 
    return function(){ 
    return x; 
    }; 
} 

console.log(retFunc(4)); 

この記事は、コンソールに次の:これは最初の質問に対する私の答えです私が望んでいた):

var idf = retFunc(4); 
console.log(idf()); 

さて、これは2番目の質問に私の答えです:

function addf(x){ 
    return function(y){ 
    return x+y; 
    }; 
} 

console.log(addf(3)(4)); 

これは動作し、コンソールに7を吐き出します。私の質問は、最初のものがなぜ機能しないのでしょうか?そして、これはしますか?両方とも別の関数を返す関数で、最終的に値を返します。

+2

関数を返すので、コードを貼り付けて実行します。 – Bhavik

答えて

3

なぜ最初は機能しませんか?

最初に動作します。正確にはです。あなたは関数を返す関数を呼び出すが、その2番目の関数は呼び出さない。代わりに印刷します。

+0

ありがとうございました!これがどのように動作しているか、私の頭を包み込むことはできませんでした。 –

+0

@firefiber:役に立つ回答を受け入れることを忘れないでください:) –

1

違いは、あなたの最初のケースでは、あなたが返された関数を呼び出していないということですが、2番目のいずれかで、あなたは

console.log(retFunc(4)); 

var idf = retFunc(4); 
console.log(idf()); // <-- note the parentheses. 
+0

私は以前これを認識していませんでした。だから、基本的に、私は最初の関数を呼び出すだけで、それを行うと、すべての戻り値の後に吐き出すだろう。それを呼び出すとき、私はそれを一組の括約物で一度呼びます。それから空の括約筋で再び呼びますか?それは最初の関数の中で2番目の関数を呼び出します。 ありがとう! –

+1

@firefiber "これは第1の関数の中で第2の関数を呼び出す" - 実際ではありません。 「この関数はこの関数の中にある」という言葉で考えてはいけません。表現と価値の観点から考える。 "このコードは実行されると関数が生成されるので、私はそれを" –

+0

と呼ぶことができます。また、それぞれの例では、 'console.log'が戻り値を出力しています。最初のケースでは、戻り値は_function式_で、それ以外の場合は_scalar値_を返しています。 –

0

の代わりにconsole.log(retFunc(4))です。 console.log(retFunc(4))を試してください。 2つの入れ子関数があります。だから、あなたも内側の機能を呼び出す必要があります。

関連する問題