我正在通过阅读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(_), histogram
是comma 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/