Рекурсивное закрытие в 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, у нее есть замыкание, в котором сначала есть функция, которая также имеет замыкание, т. Е. Имеет замкнутый цикл собственной функции в замыкании. Кто-нибудь знает, что здесь происходит, я очень растерялся, почему замкнутая петля

2 ответа

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

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

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

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

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

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

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

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

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

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

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

Ты видишь?

Другие вопросы по тегам