用于循环变量和递归的javascript
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/
这是一个面临的问题吗,比如在函数的递归过程中,变量值被替换了。对于循环,递归在中,因此对于循环中的变量被修改。
使用var声明在递归中修改的变量。
我认为您的示例应该有效。变量i
被声明为local,因此当您递归时,将使用一个新的"i"。
Javascript做全局和局部变量!
您已经将"i"定义为更广泛范围内的变量;)
我有点困惑。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>]
这对我有效。
function DragDropChanges(nodeChanged) {
if (nodeChanged.children != null) {
for (i = 0; i < nodeChanged.children.length;
var temp = i;
DragDropChanges(nodeChanged.children[i]);
i = temp;
}
}
}
相关文章:
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- Javascript 递归不知道何时退出
- 用于创建 JSON 对象的 Javascript 递归
- Javascript递归函数引用了这一点
- javascript递归,按数组位置查找子级
- Javascript递归示例所需的说明
- 尝试将Javascript递归转换为PHP(很容易)
- JavaScript:递归函数不能正常工作
- JavaScript 递归重写与迭代数组堆栈
- Javascript:递归函数返回现有值的未定义
- JavaScript递归函数错误答案
- Javascript 递归地排序对象和嵌套对象以及数组
- 创建一个 JavaScript 递归过滤器函数
- JavaScript递归函数中的错误
- JavaScript + 递归函数返回 undefined
- Javascript - 递归 - 迭代 json,用户能够跳过
- Javascript 递归函数性能下降
- Javascript 递归重置计数
- 无法理解javascript递归程序
- JavaScript递归和范围说明