4
function makeIncreaseByFunction(increaseByAmount) {
  return function (numberToIncrease) {
    return numberToIncrease + increaseByAmount;
  };
}

makeIncreaseByFunction(3)(10);

明確にするために更新されまし た (3)(10) がそのように書かれている理由を誰か説明できますか? 内部関数の引数として 10 が与えられていることは理解していますが、なぜ構文的にこのように表記されるのでしょうか。ネストされた関数が 3 つある場合、引数は常に (3)(10)(20) のように順番に記述されますか?

4

3 に答える 3

5

中間変数あり:

var increaseBy3 = makeIncreaseByFunction(3);
var foo = increaseBy3(10);

中間変数なし:

var foo = makeIncreaseByFunction(3)(10);

3どちらの場合も、最初の呼び出しで引数が に渡され、その結果、 の値でmakeIncreaseByFunction閉じられた内部関数が返されます。によって返される中間関数の変数を作成するか、単に直接呼び出すかに関係なく、同じことを行います。increaseByAmount3makeIncreaseByFunction


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 つのベータ版の削減だけです。ただし、ラムダ計算のバックグラウンドがない限り、役立つというよりも混乱を招く可能性があります。

于 2013-07-31T23:21:36.663 に答える
0

makeIncreaseByFunction(3)function10 でそれを呼び出すための構文は次のようになりますmakeIncreaseByFunction(3)(10)

fooこれは、あたかも関数( makeIncreaseByFunction(3) の戻り値がそのような関数であり、同じように評価されると想像してください)を持っているかのように理解するのは簡単ですfoo(10)

10 という値がどのように「渡される」かについては、これは間違ったやり方です。

Javascript では、関数はファースト クラス オブジェクトであることを認識しておく必要があります。内部関数に値を渡す代わりに、必要なことを行う関数を作成し、それを外部引数で呼び出します。

関数を実行時に動的に作成できることと、定義内の任意の変数の値を設定して内部の一貫性に影響を与えることができることを除いて、非関数型言語の関数内に変数を使用して追加するのと同じです。

クロージャーとは、作成された関数が、呼び出された値をインクリメントするためにその変数を使用しているにもかかわらず、初期化に使用された変数を隠すブラックボックスであるという事実を指します。

于 2013-07-31T23:23:44.453 に答える
0

var increaseBy3 = makeIncreaseByFunction(3);は ( variable のローカル ストレージを無視して) とまったく同じですincreaseByAmount

var increaseBy3 = function (numberToIncrease) {
    return numberToIncrease + 3;
};

もちろん、今は を呼び出しincreaseBy3(10)て取得することができます13increaseBy3最初の引数 plus を返す無名関数として参照するだけ3です。

于 2013-07-31T23:24:14.843 に答える