Function 闭包是避免全局变量的方法吗?

Function 闭包是避免全局变量的方法吗?,function,functional-programming,closures,global-variables,Function,Functional Programming,Closures,Global Variables,我知道使用全局变量不是一种好的做法,程序员应该尽可能避免使用它 func foo(a *A) func() *A { return func() *A { return a } } 如果我在另一个函数bar中调用foo_闭包,这意味着bar的输出将不依赖于它的输入参数,bar不能是纯函数 现在我看不到通过闭包或全局变量访问a*a变量之间的区别。在这两种情况下,它们都使输出不可预测。 作为全局变量,闭包可以被认为是一件坏事吗 附言 其他函数也可以调用foo\u c

我知道使用全局变量不是一种好的做法,程序员应该尽可能避免使用它

func foo(a *A) func() *A {
    return func() *A {
        return a
    }
}
如果我在另一个函数
bar
中调用
foo_闭包
,这意味着
bar
的输出将不依赖于它的输入参数,
bar
不能是纯函数

现在我看不到通过闭包或全局变量访问
a*a
变量之间的区别。在这两种情况下,它们都使输出不可预测。 作为全局变量,闭包可以被认为是一件坏事吗

附言
其他函数也可以调用
foo\u closure
并改变其字段。

如果函数
yourfunc
之外的“其他”在调用
yourfunc
之间更改全局变量的值,则全局变量的输出是不可预测的

但是如果变量
var
包含在闭包中,并且只有
yourfunc
可以访问,那么其他任何东西都无法访问它,因此无法更改它,因此
yourfunc
的输出完全可以通过
yourfunc
的参数和
yourfunc
的操作来预测(例如,对封闭变量
var
进行变异,这只能从
yourfunc
内部完成)

这增加了安全性和纯度,这是在第一个地方关闭的全部要点

函数的值取决于其环境(由参数和封闭变量组成)

闭包的另一个用途是当封闭环境在多个函数之间共享时,只有这些函数才能访问和更改封闭变量的值


不必要地将变量设置为全局变量,会使全局名称空间变得杂乱无章,并使它们容易被错误访问。

只要您不改变您的环境(这是纯函数所必需的),使用任何作用域中的变量都可以-无论是全局作用域还是闭包作用域。使它们具有不可变值的常量。什么是
foo_closure
,什么是
bar
,为什么你认为它不可能是纯的?@Bergi不必要地将它们全局化,会使全局命名空间变得杂乱无章。将它们放在闭包中会使n安全(r)(ish)//更受控制。@WillNess当然,变量应该放在本地作用域/名称空间/任何地方以避免冲突,但我的观点是,作用域并不重要:变量不发生变异才重要。对;没有变异,一切都是纯的;如果我们必须有变异,我们最好控制它。如果
yourfunc
变异它关闭的变量,它变为有状态的,不再是纯的。是的,这个杂质在它的独占控制下。Haskell也有状态。你可能已经限制了变异在代码中发生的位置(这样更容易推理,特别是在没有多线程的情况下),但它不是“受控的”由于您不限制可以在应用程序中调用闭包的位置。无论从何处调用
my\u函数
,只有
my\u函数
中的代码可以访问封闭变量。