Что является примером нечистой функции в JavaScript

Увидев множество чистых функций и не имеющих побочных эффектов, что может быть примером нечистой функции, которая всегда противодействует как нестабильный и основной источник ошибок?

6 ответов

Решение

Например, нечистая функция, которая имеет побочный эффект для переменной вне ее собственной области видимости:

var count = 0;

function increaseCount(val) {
    count += val;
}

Или функция, которая возвращает разные значения для одного и того же ввода, потому что она оценивает переменную, которая не задана в качестве параметра:

var count = 0;

function getSomething() {
    return count > 0;
}

Чистая функция не зависит и не изменяет состояния переменных вне ее области видимости.

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

var values = { a: 1 };

function impureFunction ( items ) {
  var b = 1;

  items.a = items.a * b + 2;

  return items.a;
}

var c = impureFunction( values );
// Now `values.a` is 3, the impure function modifies it.

Здесь мы модифицируем атрибуты данного объекта. Следовательно, мы модифицируем объект, который находится за пределами нашей функции: функция нечиста.

var values = { a: 1 };

function pureFunction ( a ) {
  var b = 1;

  a = a * b + 2;

  return a;
}

var c = pureFunction( values.a );

мы просто изменяем параметр, который находится в области действия функции, ничего не изменяется снаружи!

var values = { a: 1 };
var b = 1;

function impureFunction ( a ) {
  a = a * b + 2;

  return a;
}

var c = impureFunction( values.a );
// Actually, the value of `c` will depend on the value of `b`.
// In a bigger codebase, you may forget about that, which may 
// surprise you because the result can vary implicitly.

Здесь b не входит в объем функции. Результат будет зависеть от контекста: сюрпризы ожидаются!

var values = { a: 1 };
var b = 1;

function pureFunction ( a, c ) {
  a = a * c + 2;

  return a;
}

var c = pureFunction( values.a, b );
// Here it's made clear that the value of `c` will depend on
// the value of `b`.

Ссылка: для более подробной информации, нажмите здесь

Math.random() нечистая функция; это меняет внутреннее состояние Math объект, поэтому вы получаете разные значения при последовательных вызовах. console.log() а также alert() являются нечистыми функциями, потому что имеют побочные эффекты (хотя они генерируют одинаковое поведение и всегда возвращают одно и то же значение для идентичных вызовов).

Любая функция, которая изменяет внутреннее состояние одного из своих аргументов или значение некоторой внешней переменной, является нечистой функцией. Это включает замыкания, когда вызов метода изменяет внутреннее состояние самого замыкания:

let nextInt = (function() {
    var i = 0;
    return function() {
        return i++;
    };
})();

let a = nextInt(); // sets a to 0
let b = nextInt(); // sets b to 1
                   // etc.

С чего вы взяли, что нечистые функции всегда считаются плохой вещью?

  1. Нечистая функция - это функция, которая возвращает разные результаты для одних и тех же входных параметров, то есть зависит от некоторого состояния;
  2. Функция, которая может возвращать тот же результат для тех же самых входных параметров, но который изменяет другой объект состояния. объект, от которого он не зависит, но другие // вызывают побочные эффекты

пример:

1)

 var toggled = false; /* state */

    /*impure function*/
    function  impureFn(number){
     if(number%2 == 0)
      toggled = true;
     return toggled;
    }

    /*Execute this in order */
    impureFn(5) // returns false
    impureFn(2) //returns true
    impureFn(5) // now returns true

pure функция (получить аргумент и вернуть новое значение):

function (objectArgument) {
   return {
       value: objectArgument.value + 123,
       // other arguments
   };
}

impure функция (получить аргумент, изменить его и вернуть измененный объект):

function (objectArgument) {
   objectArgument.value += 123;
   return objectArgument;
}

Пример, который я могу придумать (это действительно довольно запутанно), Array#reverse(), Вместо того, чтобы возвращать новый массив, он изменяет его на месте, возвращая исходный массив.

Это делают и некоторые другие функции массива, такие как splice, push, shift, pop, unshift,

Другие вопросы по тегам