解释这个'return`语句?

时间:2016-04-22 15:34:43

标签: javascript node.js return

对于上下文,我正在查看npm包unique-random。这只是八行代码,所以,完整的:

'use strict';
module.exports = function (min, max) {
    var prev;
    return function rand() {
        var num = Math.floor(Math.random() * (max - min + 1) + min);
        return prev = num === prev && min !== max ? rand() : num;
    };
};

我理解发生的大部分事情,我不太确定最终的回复声明在做什么。

有人可以尽可能明确地解释它(我通常是JavaScript和编码的新手)。

我想也许这可能是关于return语句中发生了什么的一般性问题,这些语句似乎也是赋值? 是对的吗?

所以有一个条件运算符。这表示如果?左侧的内容为真,那么:的左侧是什么,而:右侧的内容是什么。那么,如果num === prevmin !== max,请将rand()分配给prev,否则将num分配给prev

是吗?

2 个答案:

答案 0 :(得分:3)

基本上,该模块返回一个函数:

module.exports = function () {
    return function rand() {
      // stuff
    };
};

因此,当您导入此模块时,您必须调用所获得的内容:

var rand = import('./rand');
rand(); // stuff

然后rand函数有两部分:

var num = Math.floor(Math.random() * (max - min + 1) + min);

计算最小值和最大值之间的随机值

return prev = num === prev && min !== max ? rand() : num;

确保新的num与上一个不同,并将新值保存在prev,您可以看到如下:

if ( num === prev && min !== max ){
   prev = rand();
} else {
   prev = num;
}
return prev;

我添加prev变量位于模块闭包中,因此可以在rand范围内访问,因此每次调用rand将具有新的prev值。

(严格来说,它不是相同的代码,但它应该做同样的事情)

答案 1 :(得分:0)

这是可以使用括号的代码的完美示例。 这可以写成如下,这将使它更清楚:

return prev = ( num === prev && min !== max )? rand() : num;

这包括分配和三元操作( x y z ),其工作方式与您所描述的完全相同。如果 x 为真,那么 y ,否则 z ;

这可以写成如下,这可能会更清楚:

if ( num === prev && min !== max ){
  prev = rand();
}
else {
  prev = num;
}
return prev;