日期:2014-05-16  浏览次数:20285 次

请教js高手一个函数编写方式的问题,详情请进。
想写一个函数遍历树,对符合条件的节点进行操作。分析这个函数有两部分——“遍历”、“操作 "。现在想将这个函数写成一个公用函数,“遍历”代码对任何树都是一样的,但“操作”可能是千差万别。
我想能不能将我的“操作”作为一个参数传入,只是把遍历函数写成一个公共函数,编写成类似如下的函数:
function   traversalChildren(node,myJob){
    myJob();                     //但是myJob中又可能要对node进行操作,怎么能得到node?
    //*******
    traversalChildren(node,myjob);//递归
}

请教高手,能指导一下吗?

------解决方案--------------------
http://meixx.go1.icpcn.com/mycode/xxtree/XXTree.js

//按照tf函数的遍历条件,遍历以node为根的树结构,对所有满足条件函数cf的节点,进行af操作
XXTree.prototype.traverseTree = function(node,tf,cf,af){
var nodeStack = [];
var rootNode = node;
var idx = 0;
for(;;){
if(node){
if(tf(node)){
if(cf(node)) af(node);
nodeStack.push({index:idx,nodeRef:node});
idx = 0;
node = node.childNodes[idx];
}else{
if(cf(node)) af(node);
if(node == rootNode) break;
node = node.pNode.childNodes[++idx];
}
}else{
node = nodeStack.pop();
if(nodeStack.length == 0) break;
idx = node.index + 1;
node = node.nodeRef.pNode.childNodes[idx];
}
}
}