0

Всем привет. Дано:

function outerFunc() {
  let counter = 0;
  return function innerFunc() {
    return counter++;
  }
}
const innerFunc = outerFunc();
console.dir(innerFunc); // 1-ый вывод
innerFunc();
innerFunc();
console.dir(innerFunc); // 2-ой вывод

введите сюда описание изображения Почему при первом выводе в консоль отображается, что переменная counter во внешнем лексическом окружении innerFunc уже со значением 2? Если ДО первого вывода в консоль я НЕ вызывал innerFunc и, как следствие, не повышал значение переменной? Со вторым выводом вопросов нет, всё, как надо, потому что я два раза вызвал innerFunc.

  • 1
    проблема не в функции а в консоли... она ленивая и отображает данные на момент открытия стрелочек в ней – Алексей Шиманский Jan 20 '22 at 08:44
  • где-то был дубль - не найду...... придёт гранди и закроет)) – Алексей Шиманский Jan 20 '22 at 08:45
  • Добавлю к комментарию @Алексей Шиманский Потому что ссылка одна и та же – doox911 Jan 20 '22 at 08:45
  • @АлексейШиманский, готово :-) делай закладочки на вопросы такие, чтобы не искать ;-) можно в избранное добавить :) – Grundy Jan 20 '22 at 08:49
  • @Grundy да я что-то не думал что этот вопрос с консолью будет часто всплывать, поэтому не закладывал) – Алексей Шиманский Jan 20 '22 at 08:50
  • @Grundy кстати, надо наверное как-то более корректно назвать вопрос дубликат (не знаю как). А то не отображает суть...кмк. – Алексей Шиманский Jan 20 '22 at 08:51
  • @АлексейШиманский, ну фактически суть прям как есть - ссылка на объект и неожиданный вывод в консоли. Я тоже не знаю как сформулировать лучше :) – Grundy Jan 20 '22 at 08:53
  • @НебытьрабомнаРуси Я прочитал ответ на дубликат, понял, что так работает консоль в Хроме. Но то, что вы написали, что ссылка одна и та же - о чём именно это говорит, расскажите пожалуйста? – Marshall Mathers Jan 20 '22 at 09:02
  • В консоль вывелось значение по ссылке. Значение по ссылке обновилось до вывода, и вы увидели одинаковые цифры. Если написать возвращаемую функцию так: return function innerFunc() { counter++; console.log(counter); return counter;}, то вы увидите все изменения. Кстати, можно и анонимную стрелочную вернуть. – doox911 Jan 20 '22 at 12:30

0 Answers0