Помогите разобраться в работе функции

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

function Counter(number) {
    return function () {
        return ++number;
    };
}

var f1 = Counter(0);
console.log(f1());
console.log(f1());
console.log(f1());
console.log(f1());

Ответы (1 шт):

Автор решения: Aziz Umarov

Это называется замыкание

function Counter(number) {
    return function () {
        return ++number;
    };
}

var f1 = Counter(0);
console.log(f1());
console.log(f1());
console.log(f1());
console.log(f1());

вызов Counter(0) возвращает функцию которая замкнула в себе переменную number.

Если вы знакомы с OOП то можно произвести аналогию с классами и объектами

function Counter(number) {
    return function () {
        return ++number;
    };
}

это что-то подобие

class Counter{
    Counter(number) { // конструктор класса Counter
      this._number = number;
    }

    someMethod: function () { // метод по умолчанию
        return ++ this._number;
    };
}

что в свою очередь

var f1 = Counter(0);
console.log(f1());

это

var f1 = new Counter(0); // вызов конструктора Counter
console.log(f1.someMethod()); // вызов someMethod объекта f1

PS. Это аналогия только для тех кто знаком с ооп. На самом деле в JS как раз таки наоборот объекты и классы часто представляют через замыкания.

→ Ссылка