0

私は次のコードを理解しています:

function subtract(p1, p2) { return p1 - p2; }
function calculate(p1, p2, calculator) { return calculator(p1, p2); }
var result = calculate(2, 3, subtract); //-1

しかし、p1 と p2 が 2 と 3 として認識される方法に関する次のコードがわかりません。

var result = calculate(2, 3, function (p1, p2) { return p1 - p2; }); //-1
4

4 に答える 4

2

コメントに対処するための更新:

私の質問が十分に明確ではなかったかもしれません。別の言い方で言い換えてみましょう。Calculate に 5 つの引数がある場合: function calculate(p1, p2, p3, p4, calculator) { return calculator(p1, p2); var result = calculate(2, 3, 9, 5, function (p4, p3) { return p3 - p4; }); のように呼び出すことは可能ですか? //4 not -1 私の実際の質問は、パラメータの 1 つが他のパラメータを引数として使用し、どのパラメータがどの引数になるべきかをどのように区別できるかということです。

無名関数が p1 および p2 引数の使用を認識している理由は、calculate 関数定義のパラメーターが、calculate の本体で引数として無名関数に渡されるものであるためです。

おそらく、ここで何が起こっているのかを理解するためのより明確な方法は、無名関数の関数定義でパラメーターの名前を変更して、同じパラメーター名が無名関数の関数定義で使用されないようにすることです。これは多くの混乱を引き起こし、プログラミング言語と抽象化の原則について教えるときに、コンピューター サイエンスの教科書で意図的に行われることがよくあります。

無名関数のパラメーター名を変更するだけでなく、calculate パラメーターの "calculator" をパラメーター名 "fn" に変更すると、calculate と calculator の混同を避けることができます。あなたの機能を考えてみましょう:

関数の定義:

function calculate(p1, p2, p3, p4, fn) {

    // here you can see that calculate's p1 and p2 arguments (above) are bound
     // to whatever function we pass into the fn parameter.
      // Whatever values p1 and p2 represent are passed into the function "fn"
       // and are assigned to the parameters p1 and p2 of fn.
    return fn(p1, p2); 
}

無名関数を使用した関数呼び出しの計算:

最初の 4 つの引数のどれが無名関数に渡され、どの引数が使用されていないかをどうやって知るのでしょうか?

// so here, we pass in an anonymous function that takes 2 parameters, one 
 //and two. We know from the definition above that whatever values are
  // passed in as calculate's p1 and p2 parameters are passed into fn, 
   //so one and two are assigned the values 2 and 3 respectively,
    // since p1 and p2 were assigned 2 and 3, and p1 and p2 were passed into
     // fn in calculate's function definition above.
calculate(2, 3, 9, 5, function(one, two) {
    return two - one;
});


// We know the values assigned to p1 and p2 are passed into the fn function
 // as the parameters of the anonymous function known as one and two.      
var result = calculate(2, 3, 9, 5, function(2, 3) {
    return 3 - 2;
}

return fn(p1, p2);p1 と p2 に割り当てられた値が無名関数に渡される理由を思い出させるために、この回答の上部にある calculate の関数定義を参照してください。

したがって、無名関数は 3 - 2 = 1 を返します。

この概念がどのように抽象化を作成できるかについて詳しくは、Joel Spolsky の記事 - Can Your Programming Language Do This?を参照してください。Joel は、なぜ JavaScript がこれほどまでに優れているのかを見事に説明しています。

于 2012-05-10T06:31:12.870 に答える
0

は参照名で呼び出されていますfunction、計算の引数名と電卓の引数名が同じであるため、混乱しているように見えます。calculatecalculator

var result = calculate(2, 3, function (p1, p2) { return p1 - p2; }); //-1

今計算関数、

function calculate(p1, p2, calculator) { return calculator(p1, p2); }

引数は次のとおりです。

p1- 2
p2- 3
calculator - function (p1, p2) { return p1-p2; }
于 2012-05-10T06:27:06.447 に答える
0

calculate は、それ自体の最初の 2 つの引数 p1 と p2 を持つ関数として、3 番目の引数 (calculator) を呼び出します。

                   //parameters                            // passing trough as arguments
function calculate(p1, p2, calculator) { return calculator(p1, p2); }

Calculator は、p1 と p2 の独自のバージョンである calculate から p1 と p2 にアクセスできます。パラメータがたまたま同じ名前を持っているため、混乱するように見えるかもしれませんが、それらは単に通過されているだけです。

あなたの例では、計算するローカル関数を渡します。これは、計算の最初の 2 つのパラメーターで呼び出されます。

于 2012-05-10T06:28:13.530 に答える
0

3 番目の引数は (無名の) 関数式です。その式の結果は、新しく作成された呼び出し可能なオブジェクトであるFunctionインスタンスへの参照です。

calculate関数には、、、およびそのオブジェクト参照が引数として渡さ2れます3。の 1 番目と 2 番目のパラメーターは、それぞれとcalculateという名前です。3 番目のパラメーターの名前はです。したがって、はで初期化され、は で初期化され、以前に作成されたインスタンスへの参照で初期化されます。p1p2calculatorcalculatep12p23calculatorFunction

calculate次に、参照されたインスタンスを呼び出し、そのとパラメータの現在の値とを 1 番目と 2 番目の引数としてFunction渡します。p1p223

呼び出された無名関数には、 と という名前の 1 番目と 2 番目のパラメーターがp1ありp2、これらは呼び出しの引数によって渡された値を想定し、23. パラメータを参照する式が評価され、結果がその呼び出し元である に返されますcalculate

calculate次に、その値を呼び出し元に返します。

このアプローチはコールバックと呼ばれます。

次回はデバッガを先に使ってください。

于 2012-05-10T06:56:11.580 に答える