我正在尝试了解以下 d3.js 示例:http: //bl.ocks.org/mbostock/3884955
在示例中,有很多行代码如下所示:
data.forEach(function(d) {
d.date = parseDate(d.date);
});
或者
x.domain(d3.extent(data, function(d) { return d.date; }));
但我不知道,d 作为参数在哪里传递,d 是什么?这种“魔法”是如何发挥作用的?
我正在尝试了解以下 d3.js 示例:http: //bl.ocks.org/mbostock/3884955
在示例中,有很多行代码如下所示:
data.forEach(function(d) {
d.date = parseDate(d.date);
});
或者
x.domain(d3.extent(data, function(d) { return d.date; }));
但我不知道,d 作为参数在哪里传递,d 是什么?这种“魔法”是如何发挥作用的?
在第一个片段中,d
是数组的一个元素data
。作为第二个参数给出的匿名函数.forEach()
对数组的每个元素执行data
并解析.date
数据的属性。
在第二种情况下,第二个参数中的匿名函数d3.extent()
告诉 D3 如何提取值以用于计算从 的范围data
。也就是说,每个元素都data
被认为是计算数组中值的范围,但元素也可能是复杂对象而不是简单数字。对于数字,不需要第二个参数(访问函数),但对于对象(如本例),您需要告诉 D3 要考虑什么值——.date
这里。
因此,在这两种情况下,匿名函数都应用于数组中的每个元素,data
并且传递给它们的参数d
是数组的相应元素。请注意,d
这里的名称是任意的,您也可以调用d
element
ordatum
或类似的名称。
您的回调不是自调用的 - 您直接调用的函数(forEach
或extent
)调用它。
该函数决定何时调用您的回调,以及使用什么参数。在 的情况下Array.prototype.forEach
,它对数组的每个元素执行一次。参数是当前元素和数组索引。
例如,一个简单的forEach
-style 函数可能如下所示:
function each(array, callback) {
for(var i = 0; i < array.length; ++ i) {
callback(array[i], i);
}
}
示例用法:
each([1,2,3], function(element, i) {
console.log(element * element, i);
})
// Output:
// 1 0
// 4 1
// 9 2
请注意您的回调是如何执行 3 次的,每次使用不同的参数。您的回调不控制参数或调用次数 - 这是在each
.