Рекурсивное закрытие в JavaScript

введите здесь описание изображения

function buildList( list ) {
  var i      = 0;
  var first  = function () {
    console.log( "in" )
    console.log( i );
  }
  var Second = function () {
    console.log( "out" )
    first();
  }
  return Second;
}

var a = buildList( [1, 2, 3] )
console.dir( a );

a(); // Here closure is created which has function first ,Here first also has one closure of itself that means recursive closure

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


person Parshuram Kalvikatte    schedule 23.12.2016    source источник
comment
Неужели так сложно правильно форматировать код и делать отступы? В любом случае, пожалуйста, опубликуйте скриншот дисплея devtools, который вас смущает.   -  person    schedule 23.12.2016
comment
Я добавил скриншот   -  person Parshuram Kalvikatte    schedule 23.12.2016
comment
у вас просто есть ссылки в обоих направлениях, петли нет. :)   -  person Davin Tryon    schedule 23.12.2016


Ответы (2)


closure — это объект особого типа, который сочетает в себе две вещи: функцию и среду, в которой эта функция была создана.

  1. Не нужно путать, поведение такое же, как и ожидается для этого кода. Вот что происходит, когда вы делаете console.dir( a ); в своем коде, он возвращает функцию Second, я думаю, вам это понятно.

  2. Теперь, когда вы расширите эту функцию, она покажет вам в Closure родительскую функцию (environment function) для Second, то есть buildList. В вашем коде он делает то же самое.

  3. Теперь нужно расширить этот function buildList, и он покажет вам его дочерние объекты, а именно var i = 0; и function first. Ваша консоль отображается, как и ожидалось.

  4. Теперь снова, когда вы откроете first(), он покажет вам в Closure родительскую функцию (environment function) first, то есть buildList. (то же самое, что и на шаге 2).

Теперь он снова повторяет шаг 3, а затем шаг 4. и так далее... Может быть, вы понимаете, что здесь происходит.

person Manoj Lodhi    schedule 23.12.2016
comment
Но я не вижу никакой функции списка сборки в моем закрытии ?? - person Parshuram Kalvikatte; 23.12.2016
comment
@Parshuram, вы выполняете тот же код, который вы разместили в вопросе? - person Manoj Lodhi; 23.12.2016
comment
Да, сэр, но это была переменная списка, вместо i, которая не имеет никакого значения, посмотрите мой скриншот сейчас - person Parshuram Kalvikatte; 23.12.2016
comment
Но все же я не вижу свою родительскую функцию в закрытии - person Parshuram Kalvikatte; 23.12.2016
comment
Тогда он показывает правильные данные. Если вы объявите локальную переменную, независимо от того, является ли она «i» или «списком», она покажет вам все переменные и функции, заключенные в окружении, кроме функции, которую вы вернули. - person Manoj Lodhi; 23.12.2016
comment
Паршурам, можете ли вы сказать мне ваши точные требования к этим функциям, могу ли я помочь вам больше. :) - person Manoj Lodhi; 23.12.2016
comment
я очень смущен этим закрытием, почему это закрытие имеет свою собственную ссылку на закрытие, разве это не увеличивает сложность javascript - person Parshuram Kalvikatte; 23.12.2016
comment
Давайте продолжим обсуждение в чате. - person Manoj Lodhi; 23.12.2016
comment
@BenAston для вас, я думаю, вам нужно взглянуть сюда. developer.mozilla.org/en/docs/Web/JavaScript/Closures - person Manoj Lodhi; 23.12.2016
comment
@BenAston Еще одна вещь для вас, stackoverflow.com/questions/19165021/ все-это-объект - person Manoj Lodhi; 23.12.2016
comment
Пожалуйста, покажите мне, где в документации говорится, что замыкания являются объектами. - person Ben Aston; 23.12.2016
comment
@BenAston Я уже дал тебе ссылку, я думаю, ты все еще не понял этого, пройди это один раз, пожалуйста. developer.mozilla.org/en/docs/Web/JavaScript/Closures - person Manoj Lodhi; 23.12.2016
comment
Закрытие — это механизм, который делает свободные переменные доступными для внутренних функций. Делает ли это закрытие объектом, а не ИМО. Концептуально замыкание более абстрактно, чем объект. В реализации JS ключевыми компонентами замыкания являются функция, ссылка на внешнее лексическое окружение, механизм настройки этой ссылки, механизм навигации по этой ссылке и реализация лексической среды. Таким образом, это больше, чем объект. В разговорной речи важным битом является ссылка на внешнее лексическое окружение. Ни в коем случае замыкание не является просто специальным объектом. - person Ben Aston; 24.12.2016
comment
@BenAston Замыкание — это объект особого типа, который сочетает в себе две вещи: функцию и среду, в которой эта функция была создана. Среда состоит из любых локальных переменных, которые находились в области видимости во время создания замыкания. В этом случае a() — это замыкание, включающее функции first(), second() и переменную i, которая существовала при создании замыкания. Если вы не принимаете документацию Mozilla (developer.mozilla.org/en/docs/ Web/JavaScript/Closures), то я думаю, что вы не хотите принимать. Удачи :) - person Manoj Lodhi; 24.12.2016
comment
@Manoj i создает замыкание, в котором есть первое и я, а не второе, потому что второе само создает замыкание, а замыкания являются специальным объектом - person Parshuram Kalvikatte; 24.12.2016

Инструменты разработчика отображают переменную a, которая является переменной, указывающей на анонимную функцию/замыкание.

В javascript функция определяется в области, а также может определять область в своем блоке тела. Область «знает» все переменные внутри определяющего блока и все переменные, которые определены вне функции, но в иерархии областей видимости, в которых определена область.

Инструменты показывают область действия возвращаемой функции (в данном случае a). Функция first определена в области действия функции a.

Переменная first также известна в рамках анонимной функции, которую вы присвоили переменной first.

И вот что вы видите на своем экране: first — это переменная, содержащая функцию. В рамках этой функции известна переменная first, указывающая на функцию. В рамках этой функции...

Понимаете?

person Peter Paul Kiefer    schedule 23.12.2016
comment
Если вы говорите, что у первого тоже есть своя область, то почему у второй нет своей области,,,??? он имеет только первую область и область списка ?? - person Parshuram Kalvikatte; 23.12.2016
comment
Да, похоже, что хром-отладчик показывает только переменные в области, которые используются в этой области. См. текст кода в 3-й строке вывода скриншота. - person Peter Paul Kiefer; 23.12.2016