Javascript 如何理解'd3.histogram'源代码中'histogram.value'中的'constant(u),histogram'?

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是一个函

我通过阅读doc和src来学习d3数组。很详细,但我还是觉得很难掌握。有助于更好地理解文档,但我仍然不太确定我是否正确理解了逻辑,主要是因为使用了
常量(389;),直方图,尤其是以下行:

(value = typeof _ === "function" ? _ : constant(_), histogram)
以下是我对直方图的理解。值(value)

  • 此代码的目的是使用、
    identity
    或其他功能设置
    .value
  • 如果未给出参数,则使用
    identity
    函数
  • 如果给定了arg且arg是一个函数,则使用此函数
  • 如果arg不是一个函数,则将值设置为
    常量()
    ,其中
    表示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,