【问题标题】:Explain this `return` statement?解释这个'return'语句?
【发布时间】:2016-04-22 15:34:42
【问题描述】:

对于上下文,我正在查看 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;
    };
};

我了解大部分情况,只是不太确定最终的 return 语句在做什么。

有人可以尽可能明确地解释它吗(我对 JavaScript 和编码很陌生)。

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

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

对吗?

【问题讨论】:

  • 它会创建一个随机数,但会检查该随机数是否与上次生成的随机数相同。如果确实和上次一样,则再次调用rand(),否则返回num
  • 你是对的,加上@h2ooooooo ^ 所说的。
  • 有人可以描述prev = num === num 条件应该如何工作吗?除了true,我看不出它如何评估其他任何东西
  • @Aaron 就其本身而言,它会。但是= 是最后评估的,所以实际上prev 被设置为num === prev && min !== max ? rand() : num 的结果。我同意这不是很清楚,也不是可读的代码。我不知道这个模块是用来做什么的。
  • @AndrewTaylor 谢谢,我认为= 具有高优先级,结果它是最低优先级之一。 MDN article on JS operators precedence,有兴趣的朋友。

标签: javascript node.js return


【解决方案1】:

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

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 值。

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

【讨论】:

    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多