(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
, не являются чистыми.