一些帮助请理解JavaScript函数调用。是闭包还是递归?

时间:2013-04-19 08:52:29

标签: javascript d3.js

我正在使用D3js来树形布局来呈现一些数据,这里的工作结果是:

http://jsfiddle.net/chrisloughnane/vV3Sc/

我想学习如何正确导航树中的节点。因此,例如,我可以设置一个函数,通过单击将所有节点设置为打开/关闭,或者可能具有类别索引,以便访问者可以单击year one,并且该节点和所有子节点将设置为打开。 / p>

我已经完成了代码,我无法理解

function toggleAll(d) {
    if (d.children) {
        d.children.forEach(toggleAll);
        toggle(d);
    }
}

root.children.forEach(toggleAll);

对我来说,我使用root调用该函数,然后如果传递的节点对children的每个child都有node,我将其传递给函数名称?!如果不再有children,即它已达到leaf,则会将值从children切换为_children或反转。

当我通过每个toggleAll时发生了什么?

2 个答案:

答案 0 :(得分:2)

这里的关键是forEach,这是一个原生的javascript函数。 (文件here

此方法为数组的每个元素执行回调(toggleAll)。 d参数将由toggleAll传递给forEach函数。所以它并非来自封闭。

现在,因为toggleAll再次调用forEach,它确实会进入树的下一级递归模式,直到d.children为空。

答案 1 :(得分:0)

如果您不了解正在发生的事情,您是如何制作此工作代码的?

  

当我将它传递给toggleAll时会发生什么?

你明白这个问题中“它”的含义吗?

无论如何,你正在使用JavaScript数组(或者至少是类似数组的东西),你正在调用forEach方法,它接受一个函数并在每个元素上调用该函数。因此,当您第一次在root.children上调用forEach时,将使用数组toggleAll中的每个元素调用root.children。然后,您再次(现在递归地)为任何后续子节点调用forEach。