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