Создает ли закрытие javascript новое зарезервированное пространство в памяти для каждой итерации? - PullRequest
4 голосов
/ 11 декабря 2011

У меня есть closure Код:

    for (var i = 0, link; i < 5; i++)
    {
        link = document.createElement("a");

        link.onclick = aaa(i);
        document.body.appendChild(link);
    }

    function aaa(num)
            {
                return function ()
                {
                    alert(num);
                };
            } ;

Я недавно прочитал много о закрытии.

Есть ОДНА вещь, которую я не понимаю.

  • Когда i == 0, он приходит к aaa с i = 0 и выполняется, возвращая новую функцию, которая должна блокировать значение 0.

это хорошо. (Я понимаю это до сих пор).

Но что происходит, когда я == 1?

  • Это снова приходит к ЖЕ ААА и теперь он должен заблокировать значение 1.ок

но подождите!он уже сохраняет «замыкание» для значения «0»!

Создает ли эта структура (замыкание) новое пространство в памяти для каждой итерации?

и, если да, то как это можно сделать?быть?у нас только один централизованный aaa функционал!

Ответы [ 3 ]

4 голосов
/ 11 декабря 2011

Ваша aaa функция похожа на фабрику функций;каждый вызов возвращает новую функцию (не ту же), которая имеет переменную num в контексте выполнения, установленную в качестве начального аргумента aaa.

2 голосов
/ 11 декабря 2011

Каждый раз, когда вы вызываете aaa, он создает функцию new с совершенно другим контекстом / областью действия, даже если вы используете одни и те же аргументы. замыкание использует пространство памяти для хранения значений контекста.

0 голосов
/ 28 сентября 2013

Еще одно слово, которое я хочу добавить к этому и аналогичным вопросам: при каждом вызове функции external (в данном случае aaa) создается другая локальная переменная num, которая содержит значение, переданное из i. Это разные версии переменной num, которые запоминаются каждым внутренним экземпляром функции (в данном случае анонимной функцией), созданным в каждом aaa(i) вызове.

Если параметр из вызова функции внешней функции (в данном случае aaa(i)) - это не , передаваемый по значению , а , передаваемый по ссылке , тогда разные версии локального num может указывать на один и тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...