knownArgs
変数は、呼び出されarguments
たときの値のコピーを保持します。partial()
その呼び出しは別の関数を返し、そのコード内にarguments
はまったく異なるリストがあります—それらはその返された関数に渡される引数です。言い換えると:
var p = partial(someFunction、 "hello"、 "world");
がp()
呼び出されると、knownArgs
「hello」と「world」になりsomeFunction
ます(もちろん、最初のループは1から始まることに注意してください)。の呼び出しがp()
次のようになっている場合:
p( "how"、 "are"、 "you");
次に、最初に「hello」と「world」をrealArgs
(から)リストにプッシュし、次に、から、にknownArgs
渡される3つのパラメーターをプッシュします。p()
arguments
編集—評価方法の段階的な内訳map(partial(op["+"], 1), [0, 2, 4, 6, 8, 10]);
:
まず、op["+"]
評価する必要があります。私はそれが関数を返すと推測しています、おそらく次のようなものです:
function add(a, b) {
return a + b;
}
その「追加」関数と値1
がに渡されpartial()
ます。partial()
したがって、arguments
疑似配列の内部は次のようになります。
[ add, 1 ]
つまり、最初のパラメーターはfromの「add」関数でop["+"]
あり、2番目のパラメーターはその値1
です。partial()
匿名関数を返す前に実際に行う唯一のことは、に保存arguments
することknownArgs
です。奇妙なarguments
疑似変数には、関数呼び出しごとに常に新しい値が割り当てられるため、これを行う必要があります。匿名関数のコードが後でアクセスできるように、ここに保存されています。
ここで、から返された無名関数partial()
とその偶数の配列を使用して、を呼び出しますmap()
。その関数はおそらく次のようになります(私は本を持っていません):
function map(fn, list) {
var i, result = [];
for (i = 0; i < list.length; ++i) {
result.push( fn( list[i] ) );
}
return result;
}
の内部map()
では、最初のパラメーターは、の前の呼び出しから返された無名関数partial()
です。その関数は何をしますか?partial()
それは、最初の呼び出しを除いて、元の呼び出しからのパラメーターと、それに渡されたパラメーターを組み合わせたものです。関数は1つのmap()
パラメーターのみを渡すため、無名関数への各呼び出しで結果として得られるパラメーターリストは、1
渡される値にpartial()
なり、各反復で、リストとは異なる偶数になります。
より簡単な例は、電話をかけたときに何が起こるかを検討することです。
partial(op["+"], 1)(2);
つまり、呼び出しpartial()
てすぐにその戻り値(無名関数)を使用する場合です。効果は、呼び出しと同じになります。
add(1, 2);