【问题标题】:how can one function in JavaScript be "defined" two times in a different way? [duplicate]JavaScript 中的一个函数如何以不同的方式“定义”两次? [复制]
【发布时间】:2018-02-01 23:38:55
【问题描述】:

这是“Eloquent JavaScript”一书中的一个例子(我想你知道这本书):

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

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

代码的作用不是很重要。

问题是:groupBy 函数有两个不同的“主体”,即据我所知,它做的事情完全不同。在第一种情况下,它做了很多逻辑,但第二次,它首先有一个不同的第二个参数(function(person) 而不是groupOf,其次,它只是划分了一个数组元素属性(即39 人的数组中的一个人的死亡日期)乘以 100。

同一个函数怎么会做不同的事情呢?我明白了
相同功能的这两个实例以某种方式合作,但这种合作的一般原则是什么?

谢谢!

【问题讨论】:

  • 您将函数声明与函数调用混淆了。第一个是定义函数的作用。第二次使用参数调用它
  • 第二次调用函数并将函数作为第二个参数传递。
  • 您现在应该做的一件事是学习如何使用 JavaScript 调试器。如果您在此代码的最顶部放置 debugger; 语句,则可以在打开开发者工具的任何浏览器中加载它。它将在debugger; 声明处停止。然后单击 Step In 按钮,看看会发生什么。查看当前状态并理解后,继续单击 Step In。每次单击它都会跳到下一条要执行的语句。然后你很快就会明白发生了什么。这是guide to the Chrome DevTools

标签: javascript function


【解决方案1】:

下面的代码不是“重新定义”groupBy。它只是调用它:

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

groupBy 函数接收回调函数作为第二个参数 (groupOf)。你在那里传递了一个匿名函数,它返回Math.ceil(person.died / 100);

【讨论】:

    【解决方案2】:

    第一个

    function groupBy(array, groupOf) {}
    

    是一个函数声明,其中函数的名称是groupBy,它是全局可访问的

    第二个

    var byCentury = groupBy(ancestry, function(person) {});
    

    是一个函数调用。这里将返回的值赋给一个变量 byCentury。

    你可能因为function(person) {}而感到困惑。 请注意,在 Javascript 中,我们有 First Class Functions,这意味着函数被视为与任何其他变量一样。因此函数作为参数传递给函数 groupBy

    【讨论】:

    • 不,groupBy 第二次出现是调用函数。
    • 感谢您的指出。我已经编辑了我的答案
    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 2020-01-15
    • 2016-03-02
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多