@taki154

Почему без return function код не работает?

Добрый день!

Не могу разобраться почему для кода, представленного ниже необходим return для function(). По сути же значение возвращается из внутренней функции, зачем возвращать саму функцию?

function makeCounter() {

  var currentCount = 1;

  return function() {
    return currentCount++;
  };
}

var counter = makeCounter();


Понимаю, что вопрос банальный, но все копья обломал. Спасибо. :)
  • Вопрос задан
  • 450 просмотров
Решения вопроса 1
@Faliah
В данном случае вы получаете своего рода фабрику счётчиков. При каждом вызове 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()
  • Можно передавать функцию в качестве параметра в другую функцию
  • Функцию можно возвращать из другой функции, как в вашем примере


Таким образом, хотя данная функция не несёт в себе сложной логики, но она иллюстрирует множество важнейших концепций, без знания которых будет очень тяжело понимать как работают многие бибилиотеки
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rou1997
@Rou1997
Именно этот код лишен смысла, это безграмотно составленное учебное пособие либо код сгенерированный автоматически, на практике замыкания используются прежде всего тогда когда требуется реализовать не просто вызов функции, а событие, в частности для асинхронности, чтобы понять это и многое другое - практикуйтесь с реальным кодом, например разных API библиотек, а не страдайте х....
Ответ написан
Комментировать
@yeti357
эта функция создаёт счётчик, что бы этот счётчик увеличивался, его надо вызывать
var counter = makeCounter();
var counter2 = makeCounter();
counter2(); // 1
counter2(); // 2
counter(); // 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы