【问题标题】:Is closure is the way to avoid global variable?闭包是避免全局变量的方法吗?
【发布时间】:2019-04-12 17:51:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 只要你没有改变你的环境(这对于纯函数是必要的),使用来自任何范围的变量都可以——无论是全局范围还是闭包范围。使它们成为具有不可变值的常量。
  • foo_closure是什么,bar是什么,为什么你认为它不能是纯的?
  • @Bergi 使它们不必要地全局化,但是,散布全局命名空间。并将它们放在一个闭包中使突变安全(r)(ish)//更多地受到控制。
  • @WillNess 当然,应该将变量放在本地范围/命名空间/任何地方以避免冲突,但我的意思是范围无关紧要:唯一重要的是变量不发生突变.
  • 对;没有变异,一切都是纯洁的;如果我们必须进行突变,我们最好控制。

标签: function functional-programming closures global-variables


【解决方案1】:

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

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

这提高了安全性和纯度,这就是首先要关闭的重点。

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

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

拥有不必要的全局变量,会弄乱全局名称空间并使它们对错误访问负责。

【讨论】:

  • 如果yourfunc 改变了它关闭的变量,它就会变成有状态的并且不再是纯粹的。
  • 是的,这种杂质在它的专属控制之下。 Haskell 也有 State。
  • 您可能已经限制了代码中可能发生突变的位置(以便更容易推理,尤其是在没有多线程的情况下),但它不是“受控制”,因为您没有限制可以在应用程序中调用闭包的位置。
  • 无论从哪里调用my_function,只有my_function 中的代码可以访问封闭的变量。
猜你喜欢
  • 2012-02-25
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2012-02-02
  • 2015-12-26
相关资源
最近更新 更多