2013-03-05 6 views
0

Я не понимаю, как вызов этой функции работаетпонимание Итератор в Js закрытия

function setup(x) { 
    var i = 0; 
    return function() { 
     console.log(i); 
     return x[i++]; 

    }; 
} 

var next = setup(['a', 'b', 'c']); 

console.log(next());//a 
console.log(next());//b 
console.log(next());//c 

как i не сбрасывается в 0 при каждом вызове?

+0

возможно дубликат [Как работают укупорочные JavaScript?] (Http://stackoverflow.com/questions/111102/how-do-javascript-closures -work) –

+0

@MikeSamuel Я просматривал это сообщение раньше, и это немного отличается тем, что мне просто интересно об этом конкретном итераторе, а не в широком смысле «как работают замыкания». – 1252748

+0

первый ответ на этот вопрос также ответит: «Как« i »не сбрасывается до 0 при каждом вызове?» –

ответ

1

В коде:

> 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.

+0

"_So имеет замыкание как для i, так и для x, значения которых теперь могут быть изменены только функцией.« Окая. Но что мешает 'i' отбрасываться каждый раз? Если я поставлю что-то вроде 'console.log ('после i')' в строке после 'var i = 0', а затем сделаю три' console.log (next()); 's вижу только распечатку 'после i' один раз - [JSBIN] (http://jsbin.com/emagit/1/edit). Я просто не понимаю, как можно вызвать эту именованную функцию 'setup()', не выполняя ничего вне анонимной функции во втором и третьем вызовах. Извините, что я был глупым.:/ – 1252748

+0

'i' не сбрасывается, потому что' setup' вызывается только один раз. После этого вызывается 'next', который каждый раз присваивает новое значение (' i ++ '). – RobG

+0

Хорошо ... создание смысла. Спасибо. поэтому [этот пример скрипта] (http://jsbin.com/uguvig/1/edit) знает, что 'setup' является функцией, потому что даже если' next() 'указывает только на возвращаемую функцию, потому что когда она была изначально создана , он имел доступ к родительской функции 'setup()'? Он будет иметь доступ ко многим слоям «родительских» функций? Надеюсь, этот вопрос ясен. Пожалуйста, дайте мне знать, если мне нужно отредактировать его. – 1252748

0

i не сбрасывается, поскольку он был установлен за пределами функции, назначенной next. Фактически в строке прямо над ней.

+0

Я не понимаю. похоже, что он установлен в первой строке функции, которая присваивается 'next', _viz_. 'reset()' – 1252748

+0

Нет, строка 'var next = setup (['a', 'b', 'c']); ** вызывает ** функцию настройки, которая возвращает ** другое ** анонимное функция. 'i' устанавливается за пределами этой функции, поэтому он не получает сброс. – nfechner

Смежные вопросы