0

我正在尝试了解以下 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 是什么?这种“魔法”是如何发挥作用的?

4

2 回答 2

2

在第一个片段中,d是数组的一个元素data。作为第二个参数给出的匿名函数.forEach()对数组的每个元素执行data并解析.date数据的属性。

在第二种情况下,第二个参数中的匿名函数d3.extent()告诉 D3 如何提取值以用于计算从 的范围data。也就是说,每个元素都data被认为是计算数组中值的范围,但元素也可能是复杂对象而不是简单数字。对于数字,不需要第二个参数(访问函数),但对于对象(如本例),您需要告诉 D3 要考虑什么值——.date这里。

因此,在这两种情况下,匿名函数都应用于数组中的每个元素,data并且传递给它们的参数d是数组的相应元素。请注意,d这里的名称是任意的,您也可以调用d elementordatum或类似的名称。

于 2015-01-21T12:43:41.783 回答
1

您的回调不是自调用的 - 您直接调用的函数(forEachextent)调用它。

该函数决定何时调用您的回调,以及使用什么参数。在 的情况下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.

于 2015-01-21T12:45:13.090 回答