3

在 D3 v2.4.2 github 存储库中引用了子弹图示例

我有几个问题可以帮助澄清这个例子中发生了什么。

1)在 bulletChart 函数中有 8 个声明,形式为 bullet.ranges = function(x) {}、bullet.markers = function(x) {} 等。这个子弹对象来自哪里?它是内置在库中的吗?我以为我们已经将变量范围设置为函数 bulletRanges,或者这两个不同的范围变量?

2)这些函数内部实际发生了什么?

3)最后一个问题。当 bulletChart 函数开始执行时,它是在执行时开始执行子弹函数还是等待显式调用?因为我从来没有真正看到过明确调用的 bullet(g) ?

这个库可能真的很混乱。非常感谢任何帮助。

4

1 回答 1

5

1)bullet名称开头的 是指在第 70 行创建的同名函数。调用将成员添加到对象,该对象也是可调用的。它基本上是一种允许自定义返回对象的方法。在 OO 术语中,bullet是一个对象,函数为其成员定义访问器。函数bulletRanges等为外部bulletChart函数提供了类似的功能。在 OO 术语中,考虑嵌套对象。

2) 见 1。函数是函数内部定义的变量的访问器bullet,允许以这种方式自定义行为。同样,OO 等价物将是通过访问器公开的对象的私有成员。

3)函数的返回值bullet是可调用对象。这就是bulletChart回报。因此,示例中的函数调用发生在第 19 行和第 36 行(通过 d3 函数),通过将变量传递chart.call函数。第 5 行的赋值chart是调用构造对象和可调用闭包的代码。

如果您不熟悉 Javascript,那么查找一些有关其更奇特功能(例如闭包)的教程材料可能会有所帮助。

于 2012-05-23T21:15:34.277 回答