从d3.random返回数字

时间:2018-02-21 04:06:50

标签: javascript d3.js higher-order-functions

我想问一下变量/函数的返回类型。我有一些像这样的示例代码:

var randomX = d3.randomNormal(mean, 80),      
    randomY = d3.randomNormal(mean, 80),     
    points = d3.range(1000).map(function() {return [randomX(), randomY()]; });

randomXrandomY被声明为变量,为什么在returnrandomX()randomY()括号?

我是Javascript的新手,请帮帮我。提前谢谢!

2 个答案:

答案 0 :(得分:2)

我确信这已在其他地方得到解答,但请看一下这个例子:

function fn1(inputNumber) {
    return function () {
        return Math.round(Math.random() * inputNumber)
    }
}

var bigRand = fn1(10000);
console.log(bigRand());
console.log(bigRand());

这有点像d3.randomNormal正在做的事情。您正在通过闭包创建一个新函数,主要是在这种情况下,因此您不必反复重复相同的输入。这实际上与执行以下操作相同:

function fn2(inputNumber) {
    return Math.round(Math.random() * inputNumber)
}

console.log(fn2(10000));
console.log(fn2(10000));

请参阅How do JavaScript closures work?

答案 1 :(得分:1)

只需将特定的D3信息添加到评论和接受的答案中(很好地涵盖了问题):d3.randomNormal()会返回函数

API很清楚:

  

返回函数,用于生成具有正态(高斯)分布的随机数。 (强调我的)

如果您检查源代码,也可以看到这一点:

export default (function sourceRandomNormal(source) {
  function randomNormal(mu, sigma) {
      //bunch of code rehe...
  };
  return randomNormal;//returns the function here!
});

所以,如果你想获得实际数字,你必须调用它(括号):

d3.randomNormal([mu][, sigma])()
//parentheses here------------^

让我们证明一下。

首先,没有括号:



var random = d3.randomNormal(10, 1);
console.log(random);

<script src="https://d3js.org/d3.v4.js"></script>
&#13;
&#13;
&#13;

现在有了括号:

&#13;
&#13;
var random = d3.randomNormal(10, 1)();
console.log(random);
&#13;
<script src="https://d3js.org/d3.v4.js"></script>
&#13;
&#13;
&#13;