【发布时间】:2013-07-18 18:05:21
【问题描述】:
我是 javascript 新手,对异步方面、闭包等方面没有真正的能力。我已经对此进行了几天的研究,并进行了大量的试验和错误,但似乎无法解决我的问题,即是:
我正在尝试遍历树结构,收集所有底层节点(那些没有子节点的节点)。该节点数据被加载到全局数组中(不是最佳但需要)。我使用的 walk 函数是递归的。但是异步性质导致对函数的第一次调用在递归调用返回之前返回,因此不会询问完整的树。我尝试将它放在一个匿名函数中,该函数似乎可以遍历整个树,但是没有加载全局数组(无法访问?)。
顺便说一句,实际代码位于单独的隔离网络上,因此无法直接剪切和粘贴到此处。下面是相关部分的功能等效项(除非我打错了)。对此表示歉意。任何帮助将不胜感激。
var nodeList = new Array(); // global variable
function someFunction(rootNode) {
// unrelated processing here
walkTree(rootNode); // gather the childless nodes
return;
}
function walkTree(node) {
return function() { // required in order traverse the entire tree
// but with it, nodeList does not get populated
var num = node.numChildren();
var childNodes = node.getChildNodes();
for (var i=0; i<num; i++) {
var currentNode = childNodes.item(i);
if (currentNode.numChildren() > 0) {
walkTree(currentNode);
}
else {
var obj = new Object();
/// extract certain attributes of current node here
/// and make a variant
nodeList[nodeList.length] = obj;
}
} // END for
} // close anonymous function
} // END FUNCTION
【问题讨论】:
-
你确定这是异步的吗?在我看来它不像。
-
我看不到异步...
-
这段代码不计算任何东西。对
walkTree(rootNode)的调用会创建一个匿名函数并将其返回,但不会调用该匿名函数。目前尚不清楚您要通过此完成什么。需要异步执行吗? -
也许我使用了错误的术语。我所知道的是 walkTree 函数在连续递归调用完成之前返回,因此树只是部分加载。我习惯于执行停止直到递归完成的语言。对不起,红鲱鱼。
-
正如@TedHopp 所说,它返回一个函数,但它不调用该函数(这就是为什么
walkTree没有被调用并且你的数组没有被填充)。该函数的每次调用都会返回一个函数,然后需要调用该函数,该函数将返回一个函数......等等......所以我怀疑你不需要匿名函数构造,而只是想执行它代码。
标签: javascript recursion closures anonymous-function