提问者:小点点

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


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

func foo(a *A) func() *A {
    return func() *A {
        return a
    }
}

如果我在另一个函数bar中调用foo_闭包,这意味着bar的输出将不依赖于它的输入参数,bar不能是纯函数。

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

其他函数也可以调用foo_closure并改变其字段。


共1个答案

匿名用户

如果函数youfunc之外的其他东西在调用youfunc之间更改了全局变量的值,则全局变量的输出是不可预测的。

但是如果变量var包含在闭包中,并且只有youfunc可以访问,那么没有其他变量可以访问它,所以不能更改它,所以youfunc的输出将完全由youfunc的参数预测并通过youfunc的操作(例如,改变封闭的变量var,这只能从youfunc内部完成)。

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

函数的值取决于它的环境,由它的参数和封闭的变量组成。

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

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