Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环变量和递归的javascript_Javascript - Fatal编程技术网

循环变量和递归的javascript

循环变量和递归的javascript,javascript,Javascript,我有一个问题,在for循环中有递归: function func(node) { for(var i = 0; i < node.children.length; i++) { func(node.children[i]); } } 函数func(节点){ 对于(var i=0;i

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

function func(node) {
    for(var i = 0; i < node.children.length; i++) {
       func(node.children[i]);
    } 
} 
函数func(节点){
对于(var i=0;i
显然,因为JavaScript没有块作用域,所以每次调用函数时都会修改相同的i变量。最好的补救办法是什么?假设是常规的EcmaScript 3,我不能使用JavaScript 1.7“let”


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

我认为您的示例应该有效。变量
i
声明为局部变量,因此在递归时使用新的“i”


Javascript不支持全局和局部变量

只需使用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 );
});

实时演示:

缓存阵列的长度,这样您就可以获得以下内容:

function recurse(node) {
    for(var i = 0, count = node.children.length; i < count; i++) {
        recurse(node.children[i]);
    }
} 
函数递归(节点){
for(var i=0,count=node.children.length;i

您应该始终缓存,尤其是在处理HTMLCollection时。

我有点困惑
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>]
var span=document.getElementsByTagName(“span”)[0];
函数func(节点){
对于(var i=0;i
您已经将“i”定义为范围更广的变量;)

这是一个面临的问题,比如在函数递归期间,变量值被替换。递归在for循环中,因此for循环中的变量被修改

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

这对我很有用

 function DragDropChanges(nodeChanged) {
        if (nodeChanged.children != null) {
            for (i = 0; i < nodeChanged.children.length;
                var temp = i;
                DragDropChanges(nodeChanged.children[i]);
                i = temp;
            }
        }
    }
函数DragDropChanges(nodeChanged){
if(nodeChanged.children!=null){
对于(i=0;i
你能为
节点
发布一些示例数据吗?JavaScript将变量作用于包含
函数
或对象文本,因此对
func
的每个递归调用都应该有自己的
i
。同意。在其他情况下进行测试。你能在jsfiddle.com中发布一些示例吗?这个函数看起来只是循环而已(递归地)一段时间(假设节点有子节点)…有什么应该做的吗?如果你不想要文本节点,那么你的代码应该可以正常工作(在支持子节点的浏览器中)。只需在那里抛出一个对节点执行操作的小代码,就可以了。将此代码粘贴到控制台中,您将在所有内容上获得一个漂亮的橙色边框:
函数func(node){for(var i=0;i
好的,这是一个与修改子节点长度无关的问题。很抱歉造成混淆。请参阅链接,将对此提供更多信息。这仅适用于DOM元素,但问题是以一般方式提出的。@FLekschas它适用于所有类型的节点:好的,我的措辞是错误的。节点可以是任何东西,而不仅仅是DOM否de,例如普通对象: