Показать сообщение отдельно
  #4 (permalink)  
Старый 07.04.2015, 19:41
Кандидат Javascript-наук
Посмотреть профиль Найти все сообщения от theKingOfJava
 
Регистрация: 31.03.2015
Сообщений: 113

elshaarawy,
Суть замыкания понять легко: это функция, замкнутая на контекст. Само по себе слово замыкание сейчас употербляется почти исключительно в смысле лексического замыкания. Тут для понимания основная трудность заключается в том, что его создание происходит неявно. Причем контекст этот недоступен извне, только изнутри тела ф-ции. Чтобы лучше понять, что происходит на самом деле, приведу тебе пример некоторой имитации замыкания.
namespace={a: 1}
func=function(){alert(this.a)}
closure=function(){return func.call(namespace)}

closure()
// ::: 1

Это по сути то же замыкание -- вид сбоку. Разница в том, что имена окружения нам доступны из-вне. Тот же bind, например, делает примерно то же самое.

Сейчас идет оголтелый пиар замыканий, некоторые кукарекают, что это мощнейшее средство, величайшая абстракция, мистерия и тд. Не ведись на эту парашу. Ничего с ними нельзя сделать такого, чего нельзя сделать без них, кроме инкапсуляции (в плохим, "жабском" смысле). Единственный реальный профит, который от их использования может быть -- это то, что такой код легче оптимизируется, в теории, возможно, он будет быстрей работать, но это все вилами на воде писано, к тому же, есть обратная сторона -- замкания засирают память.
Используй их, когда это удобно, например, для пробрасывания контекста иногда годится, в тот же setTimeout из цикла, специально их втыкать куда не попадя -- не нужно, лучше наоборот -- избегать.

Последний раз редактировалось theKingOfJava, 07.04.2015 в 20:01.
Ответить с цитированием