В данном случае вы получаете своего рода фабрику счётчиков. При каждом вызове
makeCounter()
возвращается ссылка на объект фунции, а не на её результат. Так же в данном примере используется замыкание, которое дает возвращаемой функции возможность обращаться к переменной
currentCount
, которая нахоится в родительской области видимости.
function makeCounter() {
var currentCount = 1;
return function() {
return currentCount++;
};
}
var counter = makeCounter();
var counter1 = makeCounter();
console.log(counter()); //1
console.log(counter()); //2
// счётчики работают независимо друг от друга
console.log(counter1()) //1
Этот пример, конечно больше синтетический, зато охватывает несколько чрезвычайно важных концепций в JS, а именно: замыкания, области видимости, first-class function. First-class function, в свою очередь, означает ряд принципов, которым следуют абсолютно все функции, создаваемые в JS:
- Каждая функция является объектом или экзмепляром объектоного типа (instance of Object type)
- У функции могут быть свойства. К примеру запись
makeCounter.foo = "bar"
, абсолютно валидна. Подобный подход используется для создания статических свойств функции
- Ссылку на объект функции можно сохранить в переменной, а потом вызвать эту функцию. Как в вашем примере
counter()
- Можно передавать функцию в качестве параметра в другую функцию
- Функцию можно возвращать из другой функции, как в вашем примере
Таким образом, хотя данная функция не несёт в себе сложной логики, но она иллюстрирует множество важнейших концепций, без знания которых будет очень тяжело понимать как работают многие бибилиотеки