コメントに対処するための更新:
私の質問が十分に明確ではなかったかもしれません。別の言い方で言い換えてみましょう。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 がこれほどまでに優れているのかを見事に説明しています。