2012-06-04 83 views
3

我学习JavaScript和有点糊涂以下使用。这些问题可能比d3更具体。使用Javascript - 函数参数

http://mbostock.github.com/d3/ex/sunburst.html

var arc = d3.svg.arc() 
.startAngle(function(d) { return d.x; }) 
.endAngle(function(d) { return d.x + d.dx; }) 
.innerRadius(function(d) { return Math.sqrt(d.y); }) 
.outerRadius(function(d) { return Math.sqrt(d.y + d.dy); }); 

所以,

  1. 由startAngle,endAngle等取一个函数作为参数。作为一个函数而不是一个数字的论据的基本原理是什么?
  2. 在全码,没有地方“d”是defined.I在看到几乎所有的D3项目。什么是“d”?它是如何设置的或它通过哪里?

谢谢。

回答

4

第一个问题:

d3.svg.arc对象用于创建一个饼图中的切片。每个切片都需要不同的起始角度和结束角度才能正确显示。

d3.js您不会针对每个切片以两个角度传递,而是提供一个函数,该函数需要一个参数d,它是该切片的相应数据元素并返回角度。这里设置的其他参数也一样。

另一个优点是,一个数据可以包含多个属性,并且您可以决定哪个属性需要关于可视化的哪个部分。

第二个问题

当使用函数作为参数传递给另一个功能,它是常见的是使用给定的形式的函数表达式。在d3.js中,大多数用作参数的函数本身传递一个或两个参数(大部分时间是需要转换的部分数据)。在你的函数表达式中,你需要(或者至少应该)命名这些参数来解决它们。示例d中的大部分时间都用作保存特定数据项的参数的参数名称。

它不需要在其他地方定义,因为它只是一个正常的功能参数。如果你愿意,你可以用以下方式重写它:

function startAngleParam(d) { 
return d.x; 
} 

var arc = d3.svg.arc() 
.startAngle(startAngleParam) 
... 
1

d被作为参数传递给匿名函数很清楚过去了。据推测这些功能可以采取号作为参数,或者用于更复杂的操作的功能(有点像String.replace()如何利用一个替换字符串,OR的函数,通过它来运行结果阵列和返回替换值)

+0

我看到d以匿名方式传递。但是,来自其他编程语言背景,如果我使用d3库,我不应该传递d​​(无论它是什么类型)。因此,作为用户,我如何确保'startAngle'方法获得正确的d,其中有一个字段x? – bsr

+0

@bsreekanth startAngle方法将调用您传递给它的函数。如果这是一个更传统的面向对象的接口,就好像startAngle函数接收到一个带有getAngle方法的对象,该方法接收单个参数(“d”)。您需要确保getAngle方法中的'd'参数与startAngle将调用它的任何内容匹配。 – hugomg

1

1:这是一个回调函数。当你把它作为一个参数的函数不叫,而不是函数保持,并可在以后调用,也可以叫过,每当需要了。

2:参数d只是一个发送到回调函数的值,该函数用于生成结果。标识符名称d仅在回调函数,每当功能用来在刚发送到函数照例的值定义。

送入回调函数的值是包含圆弧的坐标的对象。当弧的坐标改变时,调用回调函数来计算绘制弧所需的其他值。

1

我还不能评论,但希望增加Sirko的优秀答案。他指出:

在d3.js你不要在这两个角度为每个切片过去,但提供了一个功能,它有一个参数d,这是该片相应的数据元素,并返回角度。

我想补充一点,你可能还会遇到function(d, i) { ... }这种形式的回调。当看到这个时,d引用元素的数据,i引用它的索引 - 单字母缩写按惯例使用,但您可以随意调用参数。

在遍历数据时,访问这两个项目可能会有帮助。例如,在本教程中,数据和索引都用于构建条形图:http://mbostock.github.com/d3/tutorial/bar-1.html