javascript for循环变量和递归

mco*_*cot 11 javascript

我有一个问题,我在for循环中有递归:

function func(node) {
    for(var i = 0; i < node.children.length; i++) {
       func(node.children[i]);
    } 
} 
Run Code Online (Sandbox Code Playgroud)

显然因为JavaScript没有块作用域,所以每次调用函数时都会修改相同的i变量.解决这个问题的最佳方法是什么?假设常规的EcmaScript 3和我不能使用JavaScript 1.7"let".

我知道之前已经问过这个,但是其他问题似乎没有显示递归,它们显示了一个可以使用闭包的函数调用.

小智 11

缓存数组的长度,以便您拥有以下内容:

function recurse(node) {
    for(var i = 0, count = node.children.length; i < count; i++) {
        recurse(node.children[i]);
    }
} 
Run Code Online (Sandbox Code Playgroud)

在处理HTMLCollections时,尤其应该缓存.


Šim*_*das 8

只需使用Crockford的walkTheDOM功能:

function walkTheDOM(node, func) {
    func(node);
    node = node.firstChild;
    while (node) {
        walkTheDOM(node, func);
        node = node.nextSibling;
    }
}
Run Code Online (Sandbox Code Playgroud)

您传入根节点和要为每个节点运行的函数,如下所示:

var root = document.getElementById('wrap');

walkTheDOM(root, function(node) {
    console.log( node.nodeName );
});
Run Code Online (Sandbox Code Playgroud)

现场演示: http ://jsfiddle.net/VKWTt/


kar*_*-sk 5

这是否面临问题,例如在函数递归期间变量值被替换.递归是内部环路,所以内部的变量回路,其中修改.

使用var来声明在递归时修改的变量.

  • 参考链接**[var而不是使用var](http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript)**,会给予更多对此的见解. (2认同)