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

时间:2018-11-09 06:43:39

标签: function functional-programming closures global-variables

我知道使用全局变量不是一种好习惯,程序员应尽可能避免使用它。

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

如果我在另一个函数foo_closure中调用bar,则意味着bar的输出将不依赖于其输入参数,并且bar不能是纯函数。

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

P.S 其他功能也可以调用foo_closure并对其字段进行突变。

1 个答案:

答案 0 :(得分:1)

如果函数yourfunc之外的“其他”更改了全局变量的值,则在调用yourfunc期间,使用全局变量将无法预测输出。

但是,如果变量var包含在闭包内并且只能由yourfunc访问,则其他任何人都无法访问它,因此无法更改它,因此yourfunc的输出将变为完全可以通过yourfunc的参数和yourfunc的动作来预测(例如,对封闭的变量var进行突变,这只能在yourfunc内部进行)。

这提高了安全性和纯度,这首先就是要关闭瓶盖。

一个函数的值取决于它的环境,包括它的参数和封闭的变量。

闭包的另一种用法是当封闭的环境在几个函数之间共享时,以便只有那些函数才能访问和更改封闭的变量的值。

不必要地具有全局变量,会使全局名称空间乱七八糟,并使它们易于错误访问。