Задать вопрос
HellishCode
@HellishCode

Является ли данный пример замыканием и почему ДА или НЕТ?

Здравствуйте, как вы считаете, может ли данная функция counter быть замыканием и почему ДА или НЕТ?
let count = 0;

function counter() {
  return count += 1;
}
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3
  • Вопрос задан
  • 1007 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
Xuxicheta
@Xuxicheta
инженер
Абсолютно любая функция в js образует замыкание.
Просто иногда оно пустое. А еще движки занимаются оптимизацией и убирают из скоупа неиспользуемые ссылки.

Но есть такое определение замыкания, когда замыканием можно считать только функцию, объявленную внутри другой функции. И тут уже место для неясности.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kristenstewartdadada
Frontend Developer
sergiks
@sergiks Куратор тега JavaScript
♬♬
Mozilla определяет замыкания так:
Замыкание — это комбинация функции и лексического окружения, в котором эта функция была определена.
A closure is the combination of a function and the lexical environment within which that function was declared.

Если эти вводные описания посчитать за «правильные» определения, то формально «ДА», является, хоть и вырожденным. В вашем примере это окружение совпадает с глобальным, поэтому ни о какой имитации приватных методов и свойств тут речи не идёт.

Чтобы сделать кошерное замыкание надо как следует обернуть сей код, чтобы в приватность его переменных никто извне не мог добраться:
function makeCounter() {
  // далее ваш код:
  let count = 0;
  function counter() {
    return count += 1;
  }
  // конец вашего кода.

  return counter; // вернули Функцию (с её окружением)
}

var myCounter = makeCounter();
// вот теперь к значению count не добраться - приватность!
// зато
console.log(myCounter()); // 1
console.log(myCounter()); // 2
console.log(myCounter()); // 3
Ответ написан
Ваш ответ на вопрос

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

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