Javascript - 将函数传递给未定义的函数

时间:2015-05-06 05:50:07

标签: javascript

试图解决"历史人生预期"问题http://eloquentjavascript.net/05_higher_order.html

来自http://eloquentjavascript.net/code/#5.3的解决方案如下:

function average(array) {
  function plus(a, b) { return a + b; }
  return array.reduce(plus) / array.length;
}

function groupBy(array, groupOf) {
  var groups = {};
  array.forEach(function(element) {
    if (groupOf(element) in groups)
      groups[groupOf(element)].push(element);
    else
      groups[groupOf(element)] = [element];
  });
  return groups;
}

var byCentury = groupBy(ancestry, function(person) {
  return Math.ceil(person.died / 100);
});

for (var century in byCentury) {
  var ages = byCentury[century].map(function(person) {
    return person.died - person.born;
  });
  console.log(century + ": " + average(ages));
}

// → 16: 43.5
//   17: 51.2
//   18: 52.8
//   19: 54.8
//   20: 84.7
//   21: 94

我的问题是围绕groupOf(元素)。 这里发生了什么?"元素"取值16,17,18,19,20或21(作为函数(人)的结果{return Math.ceil(person.died / 100);})。 a)groupOf(element)是什么样的? groupOf从未定义过。 b)在我看来,我可以用元素替换groupOf(元素),但这不是真的......有人可以帮助我理解我不理解的东西吗?感谢。

2 个答案:

答案 0 :(得分:0)

如果仔细查看代码中的此代码段

var byCentury = groupBy(ancestry, function(person) { // element = function(person) {return Math.ceil(person.died / 100);}
  return Math.ceil(person.died / 100);
});

groupOf只是这个函数,它作为第二个参数传递给groupBy

function(person) { // element = function(person) {return Math.ceil(person.died / 100);}
  return Math.ceil(person.died / 100);
}

因为函数只是javascript中的对象,所以你也可以将它们传递给其他函数。

答案 1 :(得分:0)

groupOf 定义的。它是var byCentury = groupBy(ancestry, /* function goes here */);

中的参数

由于所有括号,有点难以看清。它和做的一样:

var myFunctionAsAParameter = function(person) {
  return Math.ceil(person.died / 100);
}

则...

var byCentury = groupBy(ancestry, myFunctionAsAParameter);

myFunctionAsAParameter在JavaScript看到()时才会执行,您会看到:groups[groupOf(element)].push(element);

所以在这种情况下,它会被执行几次,每次都与不同的人(由foreach循环确定)。

缠绕你的头脑有点困难,但它非常强大。函数可以将其他函数作为参数。它们只会在您添加()时执行。如果需要,函数也可以返回其他函数。现在要真的伤到你的头脑。函数甚至可以作为参数返回并接受它们(称为递归)。