Eloquent Javascript 包含以下代码示例:
function map(func, array) {
var result = [];
forEach(array, function (element) {
result.push(func(element));
});
return result;
}
function asArray(quasiArray, start) {
var result = [];
for (var i = (start || 0); i < quasiArray.length; i++)
result.push(quasiArray[i]);
return result;
}
function partial(func) {
var fixedArgs = asArray(arguments, 1);
return function(){
return func.apply(null, fixedArgs.concat(asArray(arguments)));
};
}
function square(x) {return x * x;}
console.log(map(partial(map, square), [[10, 100], [12, 16], [0, 1]]));
我理解 map
和 asArray
,但是 partial
让我感到困惑。上面的调用返回
[[100, 10000], [144, 256], [0, 1]]
但是我不明白怎么办。这是我的问题:
1) partial
定义中,第一行的arguments
变量和最后一行的arguments
变量是否相同?如果不是,每个参数对象的来源是什么?
2) 当函数调用发生在上面的最后一行代码时,我的理解是 fixedArgs
绑定(bind)到 [square]
(即包含平方函数)。然后使用二维数组对其调用 concat
。许多问题,而不是正确的答案,都是从这些绑定(bind)中产生的,所以它们不可能是正确的。调用时部分绑定(bind)的变量如何?
最佳答案
1) 不,它们是不同的。第一行的 arguments
包含 partial
的参数。最后一行的 arguments
包含 partial
返回的匿名函数的参数。
2) fixedArgs
包含数组[square]
。由于它是从 asArray(arguments, 1)
创建的,因此它会跳过参数 0,即 map
,并包含所有剩余的参数。
关于javascript - 理解 Eloquent Javascript 偏函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19736878/