Рубрики
Без рубрики

Закрытие и лексическая область

Когда мы говорим, что JS является лексически, мы имеем в виду, что функция будет иметь доступ к вари … Tagged с закрытием, JavaScript, LexicalScope.

Когда мы говорим, что JS является лексически, мы имеем в виду, что функция будет иметь доступ к переменным, в контексте которой она была Определено Не в котором это называется (Что касается этих деталей – это оптимизация сбора мусора).

Давайте представим, что мы хотим создать функцию увеличения, чтобы отслеживать, сколько раз мы ее называли.

Это работает … но Только если мы отслеживаем номер в глобальной памяти

num = 0
function increment(num) {
  return num + 1
}
increment(num)
increment(num)
console.log(num) // 2;

Что если мы используем концепции закрытия вместо этого?

function count() {
  let currentCount = 0
  let random = 'primed for garbage collection'
  function increment() {
    currentCount += 1
    console.log(currentCount)
    return currentCount
  }
  return increment
}

Если я теперь назначу результат счет к имени переменной Текущее место Я смогу выйти в систему в любой момент, сколько раз меня называют.

Давайте пройдемся через это: const () Анкет

Когда мы оцениваем счет, что возвращается? Функция Приращение Анкет Обратите внимание, что эта функция имеет не был вызван.

Если бы вы посмотрели на Что Текущее место Тогда вы обнаружите, что это функция – но если вы ее вызовуте, вы можете получить текущее место.

Но подождите – когда мы вернулись счет , разве мы только вернуть функцию Приращение ? Не совсем. С ним JavaScript сохранил локальную среду, в которой Приращение был определен.

Это означает, что хотя счет был выскочен из стека вызовов, мы все еще можем получить доступ к CurrentCount через область схватки Приращение Этот JavaScript поддерживает.

Что все это значит?

const currentPlace = count()
currentPlace() // 1
currentPlace() // 2
currentPlace() // 3

Вот видео на практике и отладки с помощью инструментов Chrome Dev

Уилл -Сенэнд, основатель Codesmiths, называет лексическую область как рюкзак функции (а не более разговорное «закрытие»).

Мне это нравится по двум причинам:

  1. Закрытие – это процесс, посредством которого лексическая область становится актуальной, но довольно неточно с точки зрения данных Мы обсуждаем
  2. Поскольку лексическая область придерживается функции, когда она определена, легко думать об этом как привязанную к спине.

Тем не менее – если вы посмотрите клип, вы заметите, что Chrome называет область прицела Закрытие , так что это то, что работает для вас.

Последний момент: я проходил курс Уилла, JavaScript: Жесткие части , на Frontendmasters и я должны сказать, что я был очень впечатлен. В частности, его объяснения о закрытии и функциях более высокого порядка заслуживают внимания тем, насколько они лучше, чем большинство, которые я видел.

Оригинал: “https://dev.to/stephencweiss/closure-lexical-scope-12f4”