Функция () {this.array = [newElem, ... array]} чистая? - PullRequest
1 голос
/ 19 мая 2019

Я хочу знать, являются ли следующие две функции чистыми функциями

delete(movie: Movie): void {
    this.movies = this.movies.filter(m => m !== movie);}
receiveMovie($event) {
    this.movies = [$event, ...this.movies];
  }

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

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

(m => m !== movie) - единственная чистая функция в вашем примере кода.

мне не ясно, что такое побочный эффект

Побочный эффект - этовидимое изменение состояния.

f(x) является чистым, если не существует какой-либо последовательности операций, включая вызов f, такой, что переключение вызова на f с соседней операцией приведет к другому результату.

delete(movie: Movie): void {
    this.movies = this.movies.filter(m => m !== movie);}

не является чистым, потому что переупорядочивание шагов 2 и 3 влияет на результат

let m = ..., aMovie = ...;
m.receiveMovie(aMovie);             // Step 1
const n = m.movies.length;          // Step 2
movies.delete(aMovie);              // Step 3
console.log(n === m.movies.length);

Аналогично, если вы вообще удалите шаг 3, переупорядочивание шагов 1 и 2 влияет на результат, поэтому .receiveMovie также не является чистым.

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

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

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


Действительно трудно доказать чистоту нетривиальных функций в JavaScript.

Например,

function f(x) { return x + x; }

function blowUpTheMoon() {
  console.log('pow!');  // a visible side effect
}

// Reordering has a visible effect.
console.log('start');
f({ toString: blowUpTheMoon });

и есть все виды Proxy трюков, которые позволяют вам показать, что функции, которые ищут свойство или делают проверку instanceof, не являются чистыми.

0 голосов
/ 19 мая 2019

Вы изменяете ссылку this.movies, так что нет, это не чисто.

Побочный эффект - это то, что функция делает помимо возврата значения. Если функция делает что-то иное, чем вычисление и возврат значения на основе ее ввода, это не чисто. Задайте себе вопрос: изменила ли эта функция что-то вне ее? Если это так, это не чисто.

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

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