Javascript 如何理解'd3.histogram'源代码中'histogram.value'中的'constant(u),histogram'?
我通过阅读doc和src来学习d3数组。很详细,但我还是觉得很难掌握。有助于更好地理解文档,但我仍然不太确定我是否正确理解了逻辑,主要是因为使用了Javascript 如何理解'd3.histogram'源代码中'histogram.value'中的'constant(u),histogram'?,javascript,d3.js,Javascript,D3.js,我通过阅读doc和src来学习d3数组。很详细,但我还是觉得很难掌握。有助于更好地理解文档,但我仍然不太确定我是否正确理解了逻辑,主要是因为使用了常量(389;),直方图,尤其是以下行: (value = typeof _ === "function" ? _ : constant(_), histogram) 以下是我对直方图的理解。值(value): 此代码的目的是使用、identity或其他功能设置.value 如果未给出参数,则使用identity函数 如果给定了arg且arg是一个函
常量(389;),直方图,尤其是以下行:
(value = typeof _ === "function" ? _ : constant(_), histogram)
以下是我对直方图的理解。值(value)
:
identity
或其他功能设置.value
李>
identity
函数常量()
,其中
表示arg;但是这部分代码是常量(u),直方图(),我不明白为什么这里有一个直方图(
),我也不知道常量(u)到底想做什么常量(uu),直方图是不是一种使用?如果是,这如何有助于理解上述代码
在阅读了@Mark和@zerkms的答案后,以下是我对以下两行代码的理解:
@马克密码
d3.直方图()
.value(someFunc)
.domain(someDomain)
.阈值(某些阈值)
在为.value
、.domain
、阈值设置新的自定义函数方面工作正常
以下代码导致错误
d3.直方图()
.value()
.domain()
.阈值()
因为正如@Mark在第一点中指出的,并且在@zerkms重写的代码中清楚地表明,当没有arg时,.value
只返回标识
函数,而不返回直方图
。因此,不可能再进行链接
但我们可以通过以下代码访问默认功能的d3.histogram
:
d3.histogram().value();
d3.histogram().domain();
d3.histogram().thresholds();
这是正确的吗
非常感谢 整体
histogram.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
};
函数可以重写为
histogram.value = function(_) {
if (arguments.length) {
value = typeof _ === "function" ? _ : constant(_);
return histogram;
}
return value;
};
你是对的,它是
他们这样做只是为了保存一些语句,并将所有内容作为一个非常难以阅读的语句进行评估。整体
histogram.value = function(_) {
return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
};
函数可以重写为
histogram.value = function(_) {
if (arguments.length) {
value = typeof _ === "function" ? _ : constant(_);
return histogram;
}
return value;
};
你是对的,它是
他们这样做只是为了保存一些语句,并将所有语句作为一个极难阅读的语句进行评估。代码如下所示:
如果未给出参数,则返回当前值
如果给定了arg并且它是一个函数,则将值设置为arg并返回直方图函数
如果给定了arg,但它不是函数,则将值设置为返回arg和直方图函数的函数
这里有两个令人困惑的部分:什么是常数(41;
,为什么我们要返回直方图
常量(41;
只是创建一个函数,调用该函数时将返回arg
返回直方图
将外部函数返回到值
。返回它是为了允许函数链接,它允许您执行以下操作:
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}
>d3.histogram().value()
函数f(t){返回t}
>d3.直方图().域()
函数c(t,n){var e,r,i,o=-1,u=t.length;if(null==n){for(+++o=r){e=i=r;break}for(+++or&&(e=r),id3.histogram().thresholds()
函数d(t){返回Math.ceil(Math.log(t.length)/Math.LN2)+1}
代码如下所示:
如果未给出参数,则返回当前值
如果给定了arg并且它是一个函数,则将值设置为arg并返回直方图函数
如果给定了arg,但它不是函数,则将值设置为返回arg和直方图函数的函数
这里有两个令人困惑的部分:什么是常数(41;
,为什么我们要返回直方图
常量(41;
只是创建一个函数,调用该函数时将返回arg
返回柱状图
将外部函数返回到值
。返回该柱状图是为了允许函数链接,它允许您执行以下操作:
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}
>d3.histogram().value()
函数f(t){返回t}
>d3.直方图().域()
函数c(t,n){var e,r,i,o=-1,u=t.length;if(null==n){for(+++o=r){e=i=r;break}for(+++or&&(e=r),id3.histogram().thresholds()
函数d(t){返回Math.ceil(Math.log(t.length)/Math.LN2)+1}
感谢@Mark解释了直方图在代码中的用法。根据@zerkms重写的代码,可以清楚地看到,当arg为空时,返回值
(默认值为标识
函数),并且不会返回直方图
。您的代码above@Kenny,是的,您的附加问题是正确的,请参见上面的编辑。感谢@Mark解释代码中使用的直方图
。根据@zerkms重写的代码,可以清楚地看到,当arg为空时,返回值
(默认值为identity
function),并且不会返回histogram
。您的代码above@Kenny,是的,您的附加问题是正确的,请参见上面的编辑。谢谢@zerkms,根据我对您答案的理解,我已经编辑了进一步的问题,您能看一下吗?(太长了,所以我把它放回问题中,而不是评论中)谢谢@zerkms,