Подтвердить что ты не робот

Закрытие против анонимной функции (разница?)

Возможные дубликаты:
Что такое Closures/Lambda в PHP или Javascript в условиях неспециалиста?
В чем разница между "закрытием" и "лямбдой" ?

Привет,

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

В большинстве ссылок, которые я видел, четко указано, что они представляют собой "вещи", но я не могу понять, почему.

Может ли кто-нибудь упростить его для меня? Каковы конкретные различия между этими двумя языковыми особенностями? Какой из них более подходит для каких сценариев?

4b9b3361

Ответ 1

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

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

Рассмотрим этот гипотетический контрпример. Рассмотрим язык 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);
}