Функции, имеющие замыкание в разных версиях одной и той же области видимости функций - PullRequest
0 голосов
/ 28 апреля 2018

Рассмотрим этот кусок кода:

function foo(a){
        setTimeout(function(){
            debugger;
            a;
        }, 1000);
    }

    foo(1);
    foo(2);
    foo(3);

Что происходит, так это то, что каждый вызов функции получает правильное значение a, когда вызывается его относительная функция setTimeout, так что это как-то подразумевает, что каждая из переданных функций обратного вызова имеет замыкание в области действия функции foo, но у каждого есть снимок этого Прицел в определенный момент времени, но я не могу разобраться с этим объяснением, или мне не хватает того, что в первую очередь означает прицел, может кто-нибудь уточнить? спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018

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

  setTimeout(function(){

То есть функция, которая закрывается, и область, в которой она выполняется, является промежуточной записью области текущего выполнения foo. Когда вы звоните:

  foo(1)

создается новая запись области с a, равной 1, обычно эта запись отбрасывается, когда foo заканчивает свое выполнение, но поскольку замыкание сохраняет ссылку на нее, этого не происходит. Теперь, когда тайм-аут заканчивается, замыкание выполняется, и ссылка на замыкание теряется, поэтому ссылка на вложенную запись области видимости также теряется, и a, наконец, собирается сборщиком мусора. Когда вы вызываете foo несколько раз, создается несколько записей и замыканий, поэтому a может оценивать разные значения в обратных вызовах, поскольку они разрешаются в разные записи.

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