2017-08-24 27 views
-3

这是来自“机锋的JavaScript”一书为例(我想你知道这本书):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函数有两个不同的'body',即它完全不同的东西,据我所知。在第一个例子中,它做了很多逻辑,但是第二次,它第一次有不同的第二个参数(function(person)而不是groupOf,第二,它只是分割一个数组元素属性(这是死亡日期由100

一个人在39人)数组怎么会这样,同样的功能也不同的东西?我不明白,
相同功能的这两种情况下莫名其妙地合作,但究竟是一般的原则这种合作的?

谢谢!

+4

函数声明与函数调用混淆在一起。第一个是定义该功能的功能。第二次用参数 – abhishekkannojia

+2

调用它第二次调用函数并传递一个函数作为第二个参数。 –

+0

你现在应该做的一件事是学习如何使用JavaScript调试器。如果你在代码的最上面放置了一个'debugger;'语句,你可以在开发工具打开的任何浏览器中加载它。它将停止在'debugger;'语句中。然后点击Step In按钮,看看会发生什么。在查看当前状态并理解它之后,请继续单击“步入”。每次点击它时,它都会跳到下一个要执行的语句。那么你很快就会明白发生了什么。这是一个[Chrome DevTools指南](https://developer.chrome.com/devtools)。 –

回答

1

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

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

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

-1

第一个

function groupBy(array, groupOf) {} 

函数声明其中函数的名称为GROUPBY并且它是全局accessable

而第二个

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

funcion呼叫。这里的返回值由Cntury分配给一个变量。

可能会因为function(person) {}而感到困惑。 请注意,在JavaScript中,我们有头等函数这意味着函数被视为与任何其他变量一样。因此函数作为参数传递给函数组ByBy

+1

不,第二次出现'groupBy'就是*调用函数。 –

+0

感谢您指出。我编辑了我的答案 –

相关问题