Закрытие из-за того, что он может сделать или потому что это делает - PullRequest
15 голосов
/ 05 ноября 2010

Хорошо, это немного педантичный вопрос, но я хотел бы убедиться, что я правильно понимаю определение.Используется ли термин замыкания для описания анонимных функций, которые могут поднимать переменные в локальной области (действительно ли они это делают или нет) или только когда они делают поднимать переменные в локальной области?

Другими словами, если анонимная функция обладает способностью поднимать переменные в своей локальной области (поскольку язык предлагаетэта возможность), но не так ли это все еще считается закрытием?

Насколько я понимаю, это закрытие, только когда локальные переменные сняты.Но анонимная функция, которая этого не делает (хотя и может), не является закрытием.Так что не все анонимные функции являются замыканиями, но все замыкания являются анонимными функциями.

Снова, извините за педантизм, но эти вещи грызут меня.:)

Ответы [ 2 ]

28 голосов
/ 05 ноября 2010

Предполагая, что вы имеете в виду в контексте компьютерных наук ...

Замыкание - это функция первого класса, которая фиксирует лексические привязки свободных переменных в своей определяющей среде. После захвата лексических привязок функция становится закрытием, потому что она «закрывает» эти переменные.

Обратите внимание, это означает, что замыкания существуют только во время выполнения.

Чтобы функция была замыканием, она ортогональна анонимной или именованной функции. Вы можете создать язык, который позволит вам определять именованные функции как замыкания.

Вот "именованное" замыкание в Python:

def maker():
  count=[0]
  def counter():
    count[0]=count[0]+1
    return count[0]
  return counter
2 голосов
/ 30 декабря 2015

Здесь определено одно большое определение замыкания: lua.org

Когда функция записана в другой функции, она имеет полный доступ к локальным переменнымограждающая функция;эта особенность называется лексической областью видимости.Хотя это может показаться очевидным, это не так.Лексическая область видимости, плюс первоклассные функции, является мощной концепцией в языке программирования, но немногие языки поддерживают эту концепцию.

...