- функции F() называется
Во-первых, среда для глобального кода устанавливается и декларации для f
и gg
обрабатываются.Затем оператор присваивает gg
, что вызывает вызов f
.
2
. функция makeClosure вызывается и дается аргумент index [1]
Пока нет. Функция вызывается после запуска цикла (# 5).
Когда f
называется новый контекст выполнения создается и создъм его окружение, makeClosure
, a
и i
создаются как локальные переменные, глобальный объект находится на его видимости. Затем a
назначен новый массив empy.
3
. функция makeClosure вызывает анонимную функцию и дает ей аргумент index [1]
Звонок внутри makeClosure
.
4
. для заявления начинается . 5
. для заявлений итерации затем вызывает функцию makeClosure
Это происходит до 2.
makeClosure
называется первоначально со значением 0
.
Когда вызывается makeClosure
, создается новый контекст выполнения. Он имеет один формальный параметр x
, которому присвоено значение 0
в первый раз, 1
второе и так далее.
В цепочке областей действия для makeClosure
имеется объект выполнения для f
, поэтому он имеет доступ ко всем параметрам и переменным f
. Идентификаторы с именем Самеда «сглажены» локальными.
При каждом вызове makeClosure
возвращает объект функции, который не имеет переменных или формальных параметров. Эти объекты функций имеют цепочку областей видимости, которые определены в момент их создания и включают в себя сами, а затем экземпляр контекста выполнения makeClosure
, затем f
, а затем глобальный контекст выполнения.
Возвращаемый функциональный объект присваивается члену a
.
6
. функция makeclosure затем проверяет, соответствует ли аргумент index [0] аргументу анонимной функции 7
. функция makeClosure и анонимные функции не соответствуют 8
. цикл повторяется второй раз, создавая индекс аргумента [1] 9
. функция makeclosure затем проверяет, соответствует ли аргумент index [1] аргументу анонимной функции 10
. они соответствуют 11
.вызывается функция makeClosure и функция f() возвращает var a, которая в данный момент сохраняется как номер 1
Ничего из этого не происходит. Для каждого цикла новый вызов makeClosure
выполняется так, что новая функция возвращается с другим экземпляром объекта выполнения в своей цепочке областей видимости. Они назначаются членам a
.
Цикл for выполняет итерацию 3 раза, где i
имеет значение 0
, 1
затем 2
. Когда i
добирается до 3
, он выходит перед выполнением.
12
. Ссылка на массив (a
) возвращается и назначается глобальному g
.
13
. g[1]
. Это ссылается на вторую возвращаемую функцию, которая затем вызывается. Когда идентификатор x
внутри этой функции разрешен по своей цепочке областей видимости, найден x
внутри экземпляра makeClosure
, который его создал. Это соответствует той, которая создана со значением 1, так что x
имеет значение 1
, которое возвращается.
Я, наверное, что-то испортил, но это более или менее то, что происходит.
Так много информации о закрытии. Вы что-то застряли? Этот сайт предназначен для «моего кода - foo, я ожидаю, что он бат, он возвращает летучую мышь - что случилось?» – AlienWebguy
только новичок, желающий дважды проверить с профи на мое понимание. Приносим извинения, если мой вопрос не входит в сферу применения этого сайта. – user2117138
Эм, есть некоторые ошибки в вашей методологии. Нет никакого «вызова» какой-либо анонимной функции до начала 'for'. Нет совпадений индексов, а просто передаются аргументы вокруг и разные IIFE, возвращаемые внутри разных контекстов выполнения, которые работают из-за лексической области. –