Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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表格绘制函数-drawRow参数_Javascript_Function - Fatal编程技术网

雄辩的javascript表格绘制函数-drawRow参数

雄辩的javascript表格绘制函数-drawRow参数,javascript,function,Javascript,Function,正如其他人提到的,这段代码来自雄辩的javascript第6章。我不明白函数'drawRow'的参数是从哪里提供的。如果外部函数drawTable是某种方法,那么它可以传递数组和当前索引,这是有意义的,但事实并非如此。这只是一个普通函数,那么它从哪里获取“row”和“rowNum” function drawTable(rows) { var heights = rowHeights(rows); var widths = colWidths(rows); function dra

正如其他人提到的,这段代码来自雄辩的javascript第6章。我不明白函数'drawRow'的参数是从哪里提供的。如果外部函数drawTable是某种方法,那么它可以传递数组和当前索引,这是有意义的,但事实并非如此。这只是一个普通函数,那么它从哪里获取“row”和“rowNum”

function drawTable(rows) {
  var heights = rowHeights(rows);
  var widths = colWidths(rows);

  function drawLine(blocks, lineNo) {
    return blocks.map(function(block) {
      return block[lineNo];
    }).join(" ");
  }

  function drawRow(row, rowNum) {
    var blocks = row.map(function(cell, colNum) {
      return cell.draw(widths[colNum], heights[rowNum]);
    });
    return blocks[0].map(function(_, lineNo) {
      return drawLine(blocks, lineNo);
    }).join("\n");
  }

  return rows.map(drawRow).join("\n");
}
提前感谢所有花时间回答这个问题的人

调用所提供的回调(
drawRow
,在您的例子中)并为其迭代的数组的每个元素提供三个参数:

  • 元素
  • 索引
  • 整个阵列(此处不使用)
您还可以选择将某个对象设置为回调内部的
this

根据,提供给map的回调有三个参数:currentValue、index和array。在这种情况下,当
drawRow
被提供给
rows.map
时,row是当前值,rowNum是索引

下面是一个简单的例子:

var arr = ['a', 'b', 'c'];

function printArray(value, index) {
    console.log(index + ' ' + value);
}

arr.map(printArray);
// prints
// 0 a
// 1 b
// 2 c

正如其他人提到的,
map
方法调用
drawRow
传递适当的值。为了说明这背后的机制,让我们从头开始创建另一个名为
M_A_P
的函数,该函数也将使用适当的值调用
drawRow

function M_A_P (theArray, callback) {
    var returnArray = [];
    for (var i=0; i<theArray.length; i++) {

        var result = callback(theArray[i],i); // note this line

        returnArray.push(result);
    }
    return returnArray;
}
请记住,函数
drawRow
将作为变量
callback
传入
M__p
,数组
rows
将作为变量
theArray
传入
M_A_P
然后将使用上述方法调用
drawRow
,方法有两个参数


方法
Array.map()
的工作原理类似,但它是作为数组对象的方法而不是函数实现的。

感谢你们两位的快速回复,但我想我仍然感到困惑的是drawRow中的任何东西是如何知道“行”是什么的。我知道使用map方法可以传递您提到的三个参数,但是map方法如何应用于数组“row”,而不从任何地方提供row?@user3827668 drawRow知道什么是“row”,因为map函数为其提供了这些值。map函数需要一个具有三个参数的回调,顺序正确。您可以随意命名它们,但第一个是数组的成员,第二个是索引,第三个是对原始数组的引用。也许我在这里没有看到什么,但据我所知,最外层的函数drawTable使用参数“rows”。行是单元格数组的数组。行的任何单个元素本身就是一个“行”,它是一个单元格数组。drawRow中的map函数不知怎的知道要在哪一行上操作,这一点我不理解。当然,可以将map方法应用于变量“rows”,但不能应用于“row”。
map
按行在
rows
数组中的顺序对行进行迭代。正如您所看到的,即使drawRows函数中的
row
也调用了
map
来渲染每个单元格。omg,我不知道为什么,但在阅读了您对其他人所说内容的非常深思熟虑的重新迭代之后,我意识到,在整个过程中,我不知何故错过了底部的rows.map调用。天啊,我很抱歉浪费了你的时间。另一方面,是你的评论引发了这一认识,所以谢谢你。
M_A_P(rows, drawRow).join("\n");