Это закрытие? - PullRequest
       27

Это закрытие?

4 голосов
/ 03 апреля 2011

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

 (defun func (callback)
   callback()
)

(defun f1() 1)
(defun f1() 2)

func(f1)
func(f2)

Ответы [ 2 ]

17 голосов
/ 03 апреля 2011

Нет.

Внутри func не определена функция, которая бы охватывала локальные переменные внутри func. Вот надуманный пример, основанный на вашем Вот хороший пример:

Ввод:

(define f 
  (lambda (first-word last-word) 
    (lambda (middle-word)
      (string-append first-word middle-word last-word))))

(define f1 (f "The" "cat."))
(define f2 (f "My" "adventure."))

(f1 " black ")
(f1 " sneaky ")

(f2 " dangerous ")
(f2 " dreadful ")

Вывод:

Welcome to DrScheme, version 4.1.3 [3m].
Language: Pretty Big; memory limit: 128 megabytes.
"The black cat."
"The sneaky cat."
"My dangerous adventure."
"My dreadful adventure."
> 

f определяет и возвращает замыкание, в котором первое и последнее слова заключены и которые затем используются повторно, вызывая вновь созданные функции f1 и f2.


Это сообщение имеет несколько сотен просмотров, поэтому, если не читатели читают это, вот тот же самый глупый пример в python:

def f(first_word, last_word):
    """ Function f() returns another function! """
    def inner(middle_word):
        """ Function inner() is the one that really gets called
        later in our examples that produce output text. Function f()
        "loads" variables into function inner().  Function inner()
        is called a closure because it encloses over variables
        defined outside of the scope in which inner() was defined. """ 
        return ' '.join([first_word, middle_word, last_word])
    return inner

f1 = f('The', 'cat.')
f2 = f('My', 'adventure.')

f1('black')
Output: 'The black cat.'

f1('sneaky')
Output: 'The sneaky cat.'

f2('dangerous')
Output: 'My dangerous adventure.'

f2('dreadful')
Output: 'My dreadful adventure.'
0 голосов
/ 09 декабря 2012

Вот мой вклад как программиста JavaScript:

Замыкание - это функция, которая имеет доступ к переменным, определенным в ее лексической области видимости (область, которая может больше не присутствовать, когда замыкание фактически вызывается). Здесь:

function funktionFactory(context) {
   // this is the lexical scope of the following anonymous function
   return function() {
      // do things with context
   }
}

Как только funktionFactory вернуло, лексическая область видимости исчезла навсегда, НО (и это большое "но"), если на возвращаемую функцию все еще ссылаются (и, следовательно, не собирают мусор), то такая функция (замыкание) все еще может играть с исходной переменной context. Здесь:

var closure = funktionFactory({
   name: "foo"
});

никто, кроме closure, не может получить доступ к свойству name объекта контекста (недоступно для любой другой сущности в программном обеспечении после возврата funktionFactory).

Итак, чтобы ответить на ваш вопрос: func закрытие? Нету. И callback? ни!

...