Является ли замыкание способом избежать глобальной переменной? - PullRequest
0 голосов
/ 09 ноября 2018

Я знаю, что использование глобальной переменной не является хорошей практикой, и программисты должны избегать ее, когда это возможно.

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

Если я вызову foo_closure внутри другой функции bar, это будет означать, что вывод bar не будет зависеть от его входных аргументов и bar не может быть чистой функцией.

Теперь я не вижу разницы между доступом к переменной a *A по закрытию или по глобальной переменной. В обоих случаях они делают вывод непредсказуемым. Может ли замыкание считаться злой вещью как глобальной переменной?

P.S Другие функции также могут вызывать foo_closure и изменять его поля.

1 Ответ

0 голосов
/ 09 ноября 2018

Вывод непредсказуем с глобальной переменной, если «что-то еще» помимо вашей функции yourfunc изменяет значение глобальной переменной между вызовами на yourfunc.

Но если переменная var заключена в замыкание и доступна только для yourfunc, ничто другое не имеет к ней доступа, поэтому не может ее изменить, поэтому выходные данные yourfunc становятся полностью предсказуемыми аргументами yourfunc и действиями yourfunc (например, изменение мутированной переменной var, что может быть сделано только изнутри yourfunc).

Что повышает безопасность и чистоту, и в этом весь смысл того, чтобы затворы были в первую очередь.

Значение функции зависит от ее окружения, состоящего из ее аргументов и вложенных переменных.

Другое использование замыканий - когда вложенная среда имеет общий между несколькими функциями, так что только эти функции могут получать доступ и изменять значения вложенных переменных.

Наличие ненужных глобальных переменных, засоряет глобальное пространство имен и делает их ответственными за ошибочный доступ.

...