我正在通过阅读doc和src学习d3数组。 histogram.value's doc非常详细,但我仍然很难理解。 The source code有助于使文档更具意义,但是我仍然不确定我是否正确理解了逻辑,主要是由于使用了constant(_), histogram特别是以下几行:

(value = typeof _ === "function" ? _ : constant(_), histogram)


这是我对histogram.value(value)的了解:

histogram.value = function(_) {
    return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
  };



此代码的目的是使用.value或其他功能设置identity
如果未给出arg,则使用identity函数
如果给定arg并且arg是一个函数,则使用此函数
如果arg不是函数,则将值设置为constant(_),其中_代表arg;但是这部分代码是constant(_), histogram,我不明白为什么这里有一个histogram,也无法弄清楚constant(_)到底想做什么。


顺便说一句,constant(_), histogramcomma operator 的用法吗?如果是这样,如何帮助您理解上面的代码?



阅读@Mark和@zerkms的答案后,这就是我如何理解以下两行代码:


@Mark的代码

d3.histogram()
  .value(someFunc)
  .domain(someDomain)
  .thresholds(someThresholds);


可以为.value.domain.thresholds设置新的自定义功能正常工作;


以下代码导致错误

d3.histogram()
      。值()
      。域()
      .thresholds();


因为正如第一点中的@Mark所述,并在@zerkms的重写代码中清楚地表明,当没有arg时,.value仅返回identity函数,而不返回histogram。因此,不可能再进行链接。

但是我们可以通过以下代码访问d3.histogram的默认功能:

d3.histogram().value();
d3.histogram().domain();
d3.histogram().thresholds();


它是否正确?

非常感谢!

最佳答案

代码分解如下:


如果未给出arg,则返回value的当前值。
如果给定arg并且它是一个函数,请将value设置为arg并返回直方图函数。
如果给定arg而不是它,则将值设置为返回arg并返回直方图函数的函数。


这里有两个令人困惑的部分:constant(_)是什么,为什么我们返回histogram

constant(_)只是创建一个函数,该函数在调用时将返回arg。

返回histogram将外部函数返回到value。返回它是为了允许函数链接,这是允许您执行此操作的原因:

d3.histogram()
  .value(someFunc)
  .domain(someDomain)
  .thresholds(someThresholds);


由于每个函数都返回父函数,因此您可以继续在调用上进行构建...



编辑评论:

是的,这将返回这些方法的默认值。从源代码:

var value = identity,
  domain = extent,
  threshold = sturges;


您可以在控制台上自行检查:

> d3.histogram().value()
function f(t){return t}
> d3.histogram().domain()
function c(t,n){var e,r,i,o=-1,u=t.length;if(null==n){for(;++o<u;)if(null!=(r=t[o])&&r>=r){e=i=r;break}for(;++o<u;)null!=(r=t[o])&&(e>r&&(e=r),i<r&&(i=r))}else{for(;++o<u;)if(null!=(r=n(t[o],o,t))&&r>…
> d3.histogram().thresholds()
function d(t){return Math.ceil(Math.log(t.length)/Math.LN2)+1}

关于javascript - 如何理解“d3.histogram”源代码的“histogram.value”中的“constant(_),histogram”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38175287/

10-11 23:24