Анонимная функция - это просто функция, которая не имеет имени; больше ничего. Закрытие - это функция, которая захватывает состояние окружающей среды.
Анонимная функция не обязательно должна создавать закрытие, а закрытие не создается только для анонимных функций.
Рассмотрите этот гипотетический контрпример. Рассмотрим язык Foo, который не поддерживает закрытие, но поддерживает анонимные функции. Этот язык может либо не компилироваться, либо выдавать ошибку для кода ниже, потому что «приветствие» не определено в области внутренней функции. Тот факт, что он анонимный, не имеет значения.
function outer() {
var greeting = "hello ";
(function(name) {
alert(greeting + name);
})("John Doe");
}
Рассмотрим фактический язык, который сейчас поддерживает закрытие - JavaScript. Принимая тот же пример, что и выше, но называя внутреннюю функцию на этот раз дает:
function outer() {
var greeting = "hello ";
(function inner(name) {
alert(greeting + name);
})("John Doe");
}
Хотя внутренняя функция не является анонимным больше, она по-прежнему захватывает состояние из окружающей среды.
Закрытие обеспечивает очень необходимое удобство, поскольку в противном случае мы будем передавать каждую зависимость функции в качестве аргумента.
function outer() {
var greeting = "hello ";
(function(name, greeting) {
alert(greeting + name);
})("John Doe", greeting);
}
Нету, но это дубликат http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda мой плохой –