В коде:
> function setup(x) {
> var i = 0;
Когда setup
называется новый контекст выполнения создается с локальными переменными x
и i
. Когда выполнение начинается, x
присваивается значение переданного массива, а i
установлено на ноль.
> return function() {
> console.log(i);
> return x[i++];
> };
Эта анонимная функция возвращается. Он имеет замыкание на внешний объект выполнения, который помещается в его цепочку областей видимости (так же как и глобальный объект выполнения).
Таким образом, у него есть замыкание как i
, так и x
, значения которых теперь могут быть изменены только функцией.
> }
>
> var next = setup(['a', 'b', 'c']);
Возвращенная функция не назначен next
, так что больше не анонимно.
>
> console.log(next());//a
Когда выполняется эта строка, next
возвращает x[0]
, который является "а", и с шагом i
1.
> console.log(next());//b
Когда выполняется эта строка, next
возвращает x[1]
, который является "б", и приращения i
до 2.
> console.log(next());//c
Когда выполняется эта строка, next
возвращает x[2]
, который является «с», и приращения i
до 3.
возможно дубликат [Как работают укупорочные JavaScript?] (Http://stackoverflow.com/questions/111102/how-do-javascript-closures -work) –
@MikeSamuel Я просматривал это сообщение раньше, и это немного отличается тем, что мне просто интересно об этом конкретном итераторе, а не в широком смысле «как работают замыкания». – 1252748
первый ответ на этот вопрос также ответит: «Как« i »не сбрасывается до 0 при каждом вызове?» –