对于上下文,我正在查看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 === prev
和min !== max
,请将rand()
分配给prev
,否则将num
分配给prev
?
是吗?
答案 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;