javascript - 理解 Eloquent Javascript 偏函数

标签 javascript map higher-order-functions

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]]));

我理解 mapasArray,但是 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/

相关文章:

javascript - 使用相同着色器更改不同形状的缓冲区在渲染时失败 - WebGL

c++ - 迭代 std::map<X,std::vector<Y>> 并对 vector 进行排序

python - 如何重复一个函数n次

list - Erlang:是否可以将最小函数编写为列表折叠?

javascript - 通过 Iron :router, 模板显示操作未从 collection.findOne 方法传递数据

javascript - 如何使用 Javascript Replace() 替换文本中的单词(如果它们属于数组)

javascript - 确定一个 Javascript 对象有多少个字段

java - 按键连接两个 map

rust - 修改并返回闭包

javascript - JavaScript 中的指数规计算