我有一个问题,我在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时,尤其应该缓存.
只需使用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/
这是否面临问题,例如在函数递归期间变量值被替换.递归是内部为环路,所以内部的变量为回路,其中修改.
使用var来声明在递归时修改的变量.