Javascript slice.call(参数)和递归

时间:2010-12-06 13:18:11

标签: javascript recursion arguments

我有一个简单的递归javascript函数,可以使用其他参数调用:

AllDataRows(grid.Rows, process);
AllDataRows(grid.Rows, process, storeIDs);

问题是如果函数必须调用自身,那么任何其他参数都会丢失。我尝试使用Array.prototype.slice.call(arguments, 2)传递参数,但它们最终成为一个元素数组。然后cb函数失败,因为它不期望一个数组(它将是一个隐藏的文本框)。

我该如何解决这个问题?

由于

function AllDataRows(rowList, cb) {
  if (rowList.getRow(0).GroupByRow) {
    for (var i = 0; i < rowList.length; i++)
      AllDataRows(rowList.getRow(i).Rows, cb);
  } else {
    var args = Array.prototype.slice.call(arguments, 2);
    for (var j = 0; j < rowList.length; j++)
      cb.apply(rowList.getRow(j), args);
  }
}

1 个答案:

答案 0 :(得分:3)

function AllDataRows(rowList, cb) {
  if (rowList.getRow(0).GroupByRow) {
    for (var i = 0; i < rowList.length; i++) {
      var aa = Array.prototype.slice.call(arguments, 0);
      aa[0] = rowList.getRow(1).Rows;
      AllDataRows.apply(this, aa);
    }
  } else {
    var args = Array.prototype.slice.call(arguments, 2);
    for (var j = 0; j < rowList.length; j++)
      cb.apply(rowList.getRow(j), args);
  }
}

在进行递归调用时只需使用apply,修复参数数组以考虑您正在打开的子组。