1. Для чего замыкание существуют?
Для инкапсуляции данных.
В ООП есть модификаторы доступа (private, protected), которые закрывают доступ к данным извне класса, но позволяют обращаться к ним из методов.
В ФП для этой задачи используют замыкания, закрывая данные внутри функции. Из вне данные недоступны, но вложенные функции имеют к ним доступ.
2. В каких условиях они создаются?
Когда вложенная функция обращается к переменным внешней функции.
Хоть и просили без примеров, но на примере показать проще:
// makeCounter - внешняя функция
function makeCounter(initialValue) {
var value = +initialValue || 0;
// counter - внутренняя функция
// она использует переменную value из внешней функции
// что-бы это было возможным, для counter создается замыкание,
// в котором хранится переменная value
// переменная initialValue функции counter не нужна, поэтому ее можно "забыть"
return function counter() {
return value++;
};
}
// у нас 3 экземпляра функции counter
var counter1 = makeCounter();
var counter2 = makeCounter();
var counter3 = makeCounter(100);
// и для каждой есть своя переменная value
console.log(counter1()); // 0
console.log(counter1()); // 1
console.log(counter2()); // 0
console.log(counter1()); // 2
console.log(counter3()); // 100
// а вот получить как-то напрямую переменную value мы не можем
// инкапсуляция нам не дает поломать данные