该变量保留被调用时knownArgs
的值的副本。该调用返回另一个函数,并且在该代码内部是一个完全不同的列表——它们是传递给该返回函数的参数。换句话说:arguments
partial()
arguments
var p = partial(someFunction, "hello", "world");
当p()
被调用时,knownArgs
将是“hello”和“world”(当然,someFunction
但请注意第一个循环从 1 开始)。如果调用p()
看起来像这样:
p(“如何”、“是”、“你”);
然后它将首先将“hello”和“world”推送到realArgs
列表中(from knownArgs
),然后将三个参数传递给p()
,from 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 ]
也就是说,第一个参数是“add”函数,op["+"]
第二个是那个值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()
调用中的参数(第一个除外)与传递给它的参数组合在一起。该map()
函数只传递一个参数,因此每次调用匿名函数时生成的参数列表将是1
传递给的值partial()
,然后在每次迭代中,列表中的一个不同的偶数。
一个更简单的例子是考虑调用时会发生什么:
partial(op["+"], 1)(2);
也就是说,如果你调用partial()
然后立即使用它的返回值(匿名函数)。效果将与调用相同:
add(1, 2);