【发布时间】:2021-11-14 05:38:45
【问题描述】:
我有一个伪函数如下
let counter = 0;
function createNewFile() {
const fileName = `book_${counter++}`;
//...write file or whatever
};
上述函数createNewFile 绝对不理想,因为它依赖于外部变量counter,可能会意外更改。我正在考虑通过以下关闭和 IIFE 来减少发生这种情况的机会
const counter = (() => {
let counter = 0;
return () => counter++;
})();
console.log(counter())
console.log(counter())
/*
function createNewFile() {
const fileName = `book_${counter()}`;
//...write file or whatever
};
*/
上面的代码达到了现在counter 可以说“更难”被“意外”更改的目的。
但是,我想从函数式编程的角度来看,我们如何改进函数counter 和createNewFile?因为显然都违反了pure function 规则,两个函数在每次执行时都没有给出相同的输出,所以我很好奇如何在给定用例的情况下增强代码?
【问题讨论】:
-
这个问题对我来说没有意义。您想通过使用函数状态来避免全局变量,并且您想要一个通过闭包具有状态的纯函数。这甚至意味着什么?纯函数没有状态。
-
对于像你这样的函数,它基本上是一个生成器,“纯度”并不是一个真正相关的概念。
-
只要是要写入文件系统的动作,反正都是不纯的,因为有副作用...不是吗,那么,不管有没有依赖于可变状态?
-
最纯粹的,但无论如何最直观的方法是将计数器作为参数传递给 ...
function createNewFile(counterValue) { /* ... */ }... 像 ...createNewFile(counter);.. . 因此程序的另一部分负责counter的管理以及如何与createNewFile一起使用。
标签: javascript functional-programming closures