Javascript 具有内存的函数

Javascript 具有内存的函数,javascript,Javascript,我试图提出一个自包含的伪随机数生成器函数,它不会重复前面的输出 显而易见的非独立解决方案是: 让lastX=-1; 函数唯一编号(范围){ 设x=Math.round(Math.random()*范围-0.5); 如果(lastX==x)返回唯一编号(范围); 否则{ lastX=x; 返回x; } } for(设i=0;i{ 设lastX=-1; 返回范围=>{ 设x; 做{ x=Math.round(Math.random()*范围-0.5); }而(lastX==x); lastX=x;

我试图提出一个自包含的伪随机数生成器函数,它不会重复前面的输出

显而易见的非独立解决方案是:

让lastX=-1;
函数唯一编号(范围){
设x=Math.round(Math.random()*范围-0.5);
如果(lastX==x)返回唯一编号(范围);
否则{
lastX=x;
返回x;
}
}
for(设i=0;i<10;i++){
控制台日志(唯一编号(5))

}
您的问题(关于保持事物“自包含”的问题)的解决方案是始终将外部实体作为参数传递。这基本上与关闭它们相同,但将事物作为参数传递对于测试目的是有益的

const createUniqueNumberGenerator = lastX => uniqueNumber = range => {
 // your existing code
}

const myGenerator = createUniqueNumberGenerator();
const rand = myGenerator(10);

您的问题(关于保持事物“自包含”的问题)的解决方案是始终将外部实体作为参数传递。这基本上与关闭它们相同,但将事物作为参数传递对于测试目的是有益的

const createUniqueNumberGenerator = lastX => uniqueNumber = range => {
 // your existing code
}

const myGenerator = createUniqueNumberGenerator();
const rand = myGenerator(10);

您不必使用
localStorage
或其他复杂的过程。您只需将
lastX
封装在闭包中,以避免将其作为全局变量公开:

const uniqueNumber=(()=>{
设lastX=-1;
返回范围=>{
设x;
做{
x=Math.round(Math.random()*范围-0.5);
}而(lastX==x);
lastX=x;
返回x;
};
})();
for(设i=0;i<10;i++){
控制台日志(唯一编号(5))

}
您不必使用
localStorage
或其他复杂的过程。您只需将
lastX
封装在闭包中,以避免将其作为全局变量公开:

const uniqueNumber=(()=>{
设lastX=-1;
返回范围=>{
设x;
做{
x=Math.round(Math.random()*范围-0.5);
}而(lastX==x);
lastX=x;
返回x;
};
})();
for(设i=0;i<10;i++){
控制台日志(唯一编号(5))

}
谢谢,这似乎更合理。如果你不介意抽出一点时间,我有一些关于答案的问题。如果这是愚蠢的,我道歉,但我只做了几个星期的JS,那些嵌套的箭头函数有点超出了我的理解。在第1-4行中发生了什么,以允许lastX常量保持实例化呃,函数已经完成了?为什么我们要在整个函数的四周放上括号?再次感谢:)这个
(…)
只是一个很好的样式,可以清楚地表明这就是下面的
()调用的表达式
。函数可以访问它们所在函数的变量。如果在父函数完成执行后这样做,这仍然适用,这就是所谓的闭包。@jonaswillms
(…)
是立即调用的箭头函数所必需的,或者这是一个语法错误。谢谢,这似乎更合理。如果您不介意抽出一点时间,我有一些关于答案的问题。如果这是愚蠢的,我道歉,但我只做了几周的JS,那些嵌套的箭头函数有点让我不知所措。我怎么了发生在第1-4行,以允许lastX常量在函数完成后保持实例化?还有为什么我们要在整个函数周围放括号?再次感谢:
(…)
只是一个很好的样式,可以清楚地表明这是下面的
调用的表达式。函数可以访问它们所在函数的变量。如果在父级完成执行后执行此操作,则仍然适用,这就是所谓的闭包。@Jonaswillms立即调用的arrow函数需要
(…)
,或者这是语法错误。谢谢!我已经尝试过使用该代码并使其正常工作了!:)谢谢我已经尝试过使用该代码并使其正常工作了!:)