Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как понять "замыкание"? (https://javascript.ru/forum/misc/54941-kak-ponyat-zamykanie.html)

elshaarawy 07.04.2015 16:27

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

nerv_ 07.04.2015 16:36

http://learn.javascript.ru/#book-toc-638

MallSerg 07.04.2015 18:31

Учебник не читаем с телефона. Автоматически запускаются все примеры на странице и пробился через алерты невозможно.

Что бы понять замыкания нужно сначала разобраться с механизмом объявления переменных и областью видимости сначало почитать про scope.

theKingOfJava 07.04.2015 19:41

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

closure()
// ::: 1

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

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

nerv_ 07.04.2015 20:49

Цитата:

Сообщение от MallSerg
Учебник не читаем с телефона

напиши от этом создателю учебника

рони 07.04.2015 21:00

:dance: учебник то новый
и по теме обясняшка с http://ru.stackoverflow.com/

Как работают замыкания в JavaScript

Safort 07.04.2015 21:40

В сети так много различных объяснений, что уже просто не хочется заново набирать ответ в 100500й раз. Пожалуйста, поищи тщательнее.


Часовой пояс GMT +3, время: 23:07.