@yourisus

Какова механика работы замыкания?

Есть код похожий по логике, но никак не могу понять, где JS пытается меня обмануть, вернее как эта фича( а не баг) работает.

function inc2() {
var count = 1;
function inc() {
return count++;
};
return inc;
}

Увеличивается только на раз, ну тут логика понятна.

function inc1() {
var count = 1;
return function() {
return count++;
};
}

Тут счетчик увеличивается на 1 каждый раз при вызове, хотя мы же не присваиваем каунту значения, тогда как при разных вызовах inc1, счетчик увеличивается так, как если бы мы писали в методе inc2
count+=1;
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rou1997
@Rou1997
Почему "не присваиваем", второй код абсолютный эквивалент первого, только функция анонимная, это все равно что сравнить
var m = 5;
return m;

и
return 5;
Ровно одно и то же.
Ответ написан
@lem_prod
Надеюсь я буду отвечать в правильном направлении, так как вопрос задан, скажем так туманно.
Во первых, как уже упомянули, функции inc1 и inc2 идентичны по смыслу.

В чем вообще смысл использования замыканий в js, в подобных примерах.
Допустим вам нужно много счетчиков, не важно зачем, просто по факту, если использовать просто функции, то это будет что-то на подобии:

var counter1 = 0,
      counter2 = 2;

function inc1() {
    retunr ++counter1;
}

function inc2() {
    retunr ++counter2;
}

//ну и потом можно их вызывать когда надо...
//не очень красиво, это их только 2, а если надо 10... ну и т.д.


И тут мы можем использовать замыкания для решения этой тривиальной задачи:

function createCounter(startCount) {
  var counter = startCount || 0;

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

var counter1 = createCounter();
var counter2 = createCounter(5);


в переменных counter1 и counter2 будут функции, которые при вызове будут возвращать значения counter, НО механизм замыканий обеспечивает, что эта переменная counter для каждой функции будет своя, потому, что при каждом новом вызове createCounter создается новая область видимости.
Ответ написан
Комментировать
@ssumatokhin
inc1() и inc2() совершенно две разные функции но это и так понятно

function inc2() {
 var count = 1; // Объявляем count переменную и она сохраняется в скопе со значением 1 функции inc2()
  function inc() {
    return count++; // переменной count еще пока нет, и интропритатор начинает ее искать выше в функции         inc2() и сохраняет ее в свой скоп.
  };
 return inc; // возвращает полученое значение, при последующех вызовах, переменная будет увиличевотся на 1, поскольку у функции inc() в скопе она будет менять, а у функции inc2() как раз таки и проиходи сохранение через замыкание
}


В общем как то так )))) Если что то не правильно написал, поправьте
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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