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函数
中的代码可以访问封闭变量。