中間変数あり:
var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);
中間変数なし:
var foo = makeIncreaseByFunction(3)(10);
3
どちらの場合も、最初の呼び出しで引数が に渡され、その結果、 の値でmakeIncreaseByFunction
閉じられた内部関数が返されます。によって返される中間関数の変数を作成するか、単に直接呼び出すかに関係なく、同じことを行います。increaseByAmount
3
makeIncreaseByFunction
var foo = makeIncreaseByFunction(3)(10); の方法についてもう少し詳しく説明できますか。10 は内部関数に到達していますか? 引数が通常Javascriptで渡される方法とは構文的に異なるように見えます。– ggg
makeIncreaseByFunction(3)
関数、具体的には 内で定義された「内部関数」を返しますmakeIncreaseByFunction
。すべての関数と同様に、function ( arguments )
構文で呼び出します。この方法がより理にかなっている場合は、次のように書くことができます。
( makeIncreaseByFunction(3) )(10)
ここで起こることはmakeIncreaseByFunction(3)
、最初に gets が呼び出され、⟪内部関数⟫を返し、次に を呼び出すこと⟪inner function⟫(10)
です。
これを手で評価していた場合 (これが「構文的に」という意味だと思います)、次のように段階的に起こっていると考えることができます。
// Original invocation
var foo = makeIncreaseByFunction(3)(10);
// Substitute the definition of makeIncreaseByFunction
var foo = (function (increaseByAmount) {
return function (numberToIncrease) {
return numberToIncrease + increaseByAmount;
};
})(3)(10);
// Apply the parameter 3
var foo = (function (numberToIncrease) {
return numberToIncrease + 3;
})(10);
// Apply the parameter 10
var foo = 10 + 3;
// Final result
var foo = 13;
注: 技術的なことを言いたい場合は、ここで行っているのは 2 つのベータ版の削減だけです。ただし、ラムダ計算のバックグラウンドがない限り、役立つというよりも混乱を招く可能性があります。