如何最好地操作模块状态javascript

如何最好地操作模块状态javascript,javascript,functional-programming,Javascript,Functional Programming,我正在试图弄清楚如何最好地、以尽可能功能化的方式在该模块之外操纵模块状态 我的当前(简化)代码: //cache.js 常量缓存={}; const addToCache=(键,项)=>{ 缓存[键]=项; } 导出默认addToCache; 有没有更实用的方法来创建需要在代码库的各个部分操作的数据结构?好的,最好的解决方案是单例类: 我可以向您推荐的最佳解决方案之一是next: class UserStore { constructor(){ if(! UserStore.inst

我正在试图弄清楚如何最好地、以尽可能功能化的方式在该模块之外操纵模块状态

我的当前(简化)代码:

//cache.js
常量缓存={};
const addToCache=(键,项)=>{
缓存[键]=项;
}
导出默认addToCache;

有没有更实用的方法来创建需要在代码库的各个部分操作的数据结构?

好的,最好的解决方案是单例类:

我可以向您推荐的最佳解决方案之一是next:

class UserStore {
  constructor(){
   if(! UserStore.instance){
     this._data = [];
     UserStore.instance = this;
   }

   return UserStore.instance;
  }

 add(item){
   this._data.push(item);
  }

 get(id){
   return this._data.find(d => d.id === id);
 }
}

const instance = new UserStore();
Object.freeze(instance);

其实这不是我的解决方案,我是在尝试自己的解决方案时发现的,但上面的解决方案是最好的。您可以在下一篇文章中阅读更多内容:

“功能”和“模块状态”并不完全匹配。同意!这是我的一个问题,一些状态必须得到管理,因此如何以尽可能“功能性”的方式最好地做到这一点。对于这个一般性问题没有正确的答案。当需要新值时,可以通过调用新函数来避免很多状态,无论是非递归还是递归。如果这还不够,您可以编写返回包含结果和状态字段的元组的函数。您可以使用状态单子从这些函数中提取。然而,在所有这些情况下,我们讨论的是沿着组合传递的状态。无论如何都应该避免全局状态。嗨@bob,你能举个例子吗?我的FP课程中有一个例子,它试图说明全局。也许你可以把它应用到你的问题上。如果您对缓存特别感兴趣,还应该看看memonization。FP中的缓存需要懒惰,即在JS中很难完成。这比OP代码复杂得多。为什么你认为这是“最好的解决方案”?