Что такое чистая функция, когда мы говорим о функции внутри функции - PullRequest
1 голос
/ 23 апреля 2019

Я узнал, что чистая функция - это функция, которая не изменяет глобальное состояние, точка. Если это так, функции внутри функций могут изменять состояние внешней функции и при этом быть чистыми, правильными?

Пример:

function func1() {
  let name = "My Name"
  func2()  

  function func2() {
    // alter name here.
  }
}

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

Вот как я вижу, но мои коллеги по работе считают, что func2 не чист, и это должно быть написано как:

function func1() {
  let name = "My Name"
  func2(name)  

  function func2(name) {
    // use name here.
  }
}

Что плохо, потому что:

  • если v8 не оптимизирует это, процессор будет выполнять больше инструкций
  • слежка - плохая практика

Вопрос в том, что такое чистая функция, когда мы говорим о функции внутри функции?

Ответы [ 3 ]

2 голосов
/ 23 апреля 2019

Чистота не предназначена для заботы только о глобальных переменных, она заботится о любых нелокальных переменных (и более), которые не должны быть изменены. Внешняя переменная замыкания по-прежнему считается нелокальной, она не должна быть глобальной.

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

1 голос
/ 23 апреля 2019

A чистая функция - это функция, которая соответствует 2 требованиям:

  1. При одинаковом вводе он всегда будет возвращать одинаковый вывод.
  2. Не вызывает побочных эффектов.

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


Чтобы быть более конкретным:

  • Функция, которая изменяет что-либо вне ее области (даже если это не глобальная область), не является чистой функцией.

  • В вашем примере, если func2 изменяет переменную вне своей области видимости, то это не чистая функция:

function func1() {
  let name = "My Name"; // <-- the variable is not in the global scope but, in any case, it is outside the scope of func2
  func2();

  function func2() {
    // alter name here.
  }
}
0 голосов
/ 23 апреля 2019

Я узнал, что чистая функция - это функция, которая не изменяет глобальное состояние, точка.

Ну, это упрощенно.Чистая функция должна одна, не иметь побочных эффектов, а во-вторых, ее результат должен опираться только на аргументы.Так что, как следствие, нет государства.Ваша func1 name собственность подозрительно выглядит как состояние.Могу ли я изменить его?func1() даст разные результаты в зависимости от предыдущих вызовов?Нечистый!

Конечно, func2 нечист не подлежит сомнению.Вы написали «изменяет имя» - «имя» выходит за рамки.Это побочный эффект.

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