|
// Функции можно различать по обладанию некоторым постоянным «состоянием» |
|
// (отсутствие состояния будем называть «чистотой»): |
|
// |
|
// 1. Stateless (также: pure или «чистые»): такие функции, |
|
// результат которых зависит *только* от их аргументов. |
|
// Они не используют и не изменяют ничего, что доступно извне. |
|
// 2. Stateful («грязные»): результат этих функций может зависеть |
|
// от переменных вне тела функции. Они могут изменять эти переменные. |
|
// Их также называют функциями с «побочными эффектами» (side effects). |
|
|
|
// Создаём «грязную» функцию, |
|
// которая использует и изменяет внутри себя внешнюю переменную *count*. |
|
var count = 0; |
|
var addOne = function() { |
|
count++; |
|
return count; |
|
}; |
|
|
|
// На экране будут числа: 1, 2, 3. |
|
console.log(addOne()); |
|
console.log(addOne()); |
|
console.log(addOne()); |
|
|
|
// Смысл, который мы закладывали в *addOne*: выдавать одно за другим числа, |
|
// где каждое следующее больше предыдущего на 1. |
|
// Но мы можем нарушить этот смысл, если вручную изменим переменную, |
|
// которую внутри себя использует *addOne*. |
|
// В этом заключается «грязность». |
|
count = 100500; |
|
console.log(addOne()); |
|
|
|
// Разместим «грязную» функцию *addOne* в «чистой» функции *makeAdder*. |
|
// Так как переменная *count* доступна только внутри *makeAdder*, |
|
// но не снаружи, то мы можем быть уверены, что её никто не изменит без спроса. |
|
var makeAdder = function() { |
|
var count = 0; |
|
var addOne = function() { |
|
count++; |
|
return count; |
|
}; |
|
return addOne; |
|
}; |
|
|
|
// Таким образом, мы получаем фабрику функций, |
|
// каждая из которых после создания имеет свою собственную переменную *count*. |
|
var a1 = makeAdder(); |
|
var a2 = makeAdder(); |
|
// При выводе на экран вызовов созданных функций |
|
// они будут увеличивать каждая свой счётчик: 1, 2, 3, 1, 2. |
|
console.log(a1()); |
|
console.log(a1()); |
|
console.log(a1()); |
|
console.log(a2()); |
|
console.log(a2()); |