【问题标题】:Javascript: Recursive function with for-LoopJavascript:带有for循环的递归函数
【发布时间】:2014-02-04 18:25:42
【问题描述】:

这是我要问的关于此功能的第三个问题(我是否应该在这一点上完全重做它,也许)。

该函数建立一个参数定义大小的网格,并插入来自函数的数据,也是参数定义的。我正在尝试能够在包含唯一对象的网格中创建一个网格,尽管herehere 已经得到了很多问题的解答*谢谢@Bergi,我还有另一个问题:

这里是代码,控制台的一些日志显示里面的内容:

//Build a 3x3 grid constructor that can optionally pre-insert values into each cube
function buildGrid(rows,cols,dataFunction){
    console.log("Let's see, we have an order for "+rows+" rows, "+cols+" cols and within each,"+dataFunction);
    //check to see if dataFunction provided, and type
    if(arguments.length !== 3){
        dataFunction = function(){return 0;};
    }

    var customGrid = [];

    //create grid
    for(row=0;row<rows;row++){console.log("creating row "+(row+1)+" of "+rows);
        var customRow = [];
        for(col=0;col<cols;col++){console.log("creating col "+(col+1)+" of "+cols);

            if(typeof dataFunction == 'function'){
                data = dataFunction(); 
            }

            else{
                data = dataFunction;
            }

            customRow.push(data);console.log("finished col "+(col+1)+" of "+cols);

        }
        customGrid.push(customRow);console.log("finished row "+(row+1)+" of "+rows);
    }
    console.log("Grid completed");
    return customGrid;
}

函数调用如下所示:

var myGrid=buildGrid(3,3,function(){return buildGrid(2,2,buildSquare)});

buildSquare 只是一个构造函数。

现在是控制台日志:

evalresult[eval12][52]:  
Let's see, we have an order for 3 rows, 3 cols and within each, function (){return buildGrid(2,2,buildSquare)}
evalresult[eval12][61]:  
creating row 1 of 3
evalresult[eval12][63]:  
creating col 1 of 3
evalresult[eval12][52]:  
Let's see, we have an order for 2 rows, 2 cols and within each, function buildSquare(){counter++;return new Square();}
evalresult[eval12][61]:  
creating row 1 of 2
evalresult[eval12][63]:  
creating col 1 of 2
evalresult[eval12][73]:  
finished col 1 of 2
evalresult[eval12][63]:  
creating col 2 of 2
evalresult[eval12][73]:  
finished col 2 of 2
evalresult[eval12][76]:  
finished row 1 of 2
evalresult[eval12][61]:  
creating row 2 of 2
evalresult[eval12][63]:  
creating col 1 of 2
evalresult[eval12][73]:  
finished col 1 of 2
evalresult[eval12][63]:  
creating col 2 of 2
evalresult[eval12][73]:  
finished col 2 of 2
evalresult[eval12][76]:  
finished row 2 of 2
evalresult[eval12][78]:  
Grid Completed
evalresult[eval12][73]:  
finished col 3 of 3
evalresult[eval12][76]:  
finished row 3 of 3
evalresult[eval12][78]:  
Grid Completed

发现问题了吗?首先较大的 3x3 函数开始,在“data = dataFunction();”处,开始调用内部 2x2 函数。一旦 2x2 函数完成,函数应该跳转到 3x3 网格的下一部分,而是返回不完整的网格。我认为 for 循环变量(即“行”和“列”)将与其小范围内的值相关联,并且内部 2x2 网格的 FOR 变量不会影响 3x3 网格中外部范围的 FOR 变量.这是怎么回事?

我在这里错过了什么?

非常感谢大家。

【问题讨论】:

    标签: javascript recursion scope


    【解决方案1】:

    您需要在函数内使用var 声明变量“row”。就目前而言,该变量是全局变量,因此当对“buildGrid”进行嵌套调用时,该代码将操作同一个变量。

    也用var 声明“数据”。养成的一个好习惯是包含该行

    "use strict";
    

    在整个 JavaScript 块的顶部,或者如果有问题,至少在函数的顶部。这会将运行时置于“严格”模式,在该模式下,未能声明这样的变量会导致错误。

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 2015-07-14
      • 2017-03-15
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多