[英]javascript for loop variable and recursion
我有一个问题,我在for循环中有递归:
function func(node) {
for(var i = 0; i < node.children.length; i++) {
func(node.children[i]);
}
}
显然因为JavaScript没有块作用域,所以每次调用函数时都会修改相同的i变量。 解决这个问题的最佳方法是什么? 假设常规的EcmaScript 3和我不能使用JavaScript 1.7“let”。
我知道之前已经问过这个,但是其他问题似乎没有显示递归,它们显示了一个可以使用闭包的函数调用。
缓存数组的长度,以便您拥有以下内容:
function recurse(node) {
for(var i = 0, count = node.children.length; i < count; i++) {
recurse(node.children[i]);
}
}
在处理HTMLCollections时,尤其应该缓存。
只需使用Crockford的walkTheDOM
功能:
function walkTheDOM(node, func) {
func(node);
node = node.firstChild;
while (node) {
walkTheDOM(node, func);
node = node.nextSibling;
}
}
您传入根节点和要为每个节点运行的函数,如下所示:
var root = document.getElementById('wrap');
walkTheDOM(root, function(node) {
console.log( node.nodeName );
});
现场演示: http : //jsfiddle.net/VKWTt/
这是否面临问题,例如在函数递归期间变量值被替换。 递归是内部for循环中 ,所以内部的变量的for循环,其中修改。
使用var来声明在递归时修改的变量。
您已经在更广泛的范围内将'i'定义为变量;)
我认为你的例子应该有效。 变量i
被声明为本地变量,因此当你递归时使用新的'i'。
Javascript做全局变量和局部变量!
这对我有用。
function DragDropChanges(nodeChanged) {
if (nodeChanged.children != null) {
for (i = 0; i < nodeChanged.children.length;
var temp = i;
DragDropChanges(nodeChanged.children[i]);
i = temp;
}
}
}
我有点困惑。 i
是局部声明,所以它是不一样的i
得到修改变量。 在这个页面上测试过:
var span = document.getElementsByTagName("span")[0];
function func(node) {
for(var i = 0; i < node.children.length; i++) {
console.log([i, node]);
func(node.children[i]);
}
}
func(span);
// returns
// [0, <span id="hlinks-user">...</span>]
// [1, <span id="hlinks-user">...</span>]
// [2, <span id="hlinks-user">...</span>]
// [0, <a href="/users...">...</a>]
// [3, <span id="hlinks-user">...</span>]
// [0, <span title="1 silver...">...</span>]
// [1, <span title="1 silver...">...</span>]
// [4, <span id="hlinks-user">...</span>]
// [0, <span title="7 bronze...">...</span>]
// [1, <span title="7 bronze...">...</span>]
// [5, <span id="hlinks-user">...</span>]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.