2011-02-06 6 views
49

Возможные Дубликаты (разница?):
What is Closures/Lambda in PHP or Javascript in layman terms?
What is the difference between a 'closure' and a 'lambda'?Закрытие против анонимной функции

Привет,

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

Большинство ссылок, которые я видел, четко указывают на то, что они являются отличными «вещами», но я не могу понять, почему.

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

+2

Нету, но это дубликат http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda мой плохой –

ответ

74

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

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

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

Вы можете цитировать некоторые источники для определений, используемых в вашем ответе? – Pacerier

+0

@Pacerier Я не использовал никаких определений, кроме того, что уже упоминалось в вопросе, и это в основном «закрытие» и «анонимные функции». Я придумал примеры самостоятельно, поэтому не могу предоставить внешние ссылки для них. – Anurag

+0

То, что я имею в виду, ссылается на более определенный источник, например, из Википедии и т. Д. – Pacerier

Смежные вопросы