2016-12-23 4 views
6

enter image description hereвозвратное степенное замыкание в 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 имеет замыкание, которое имеет функцию первые, которая также имеет замыкание сами по себе, то есть он имеет повторяющийся цикл своей собственной функции в замыкании, ли кто-нибудь знает, что происходит здесь, я очень смущен, почему есть замкнутая петля

+4

Действительно ли трудно форматировать и правильно отформатировать код? В любом случае, пожалуйста, разместите снимок экрана с изображением devtools, который вас сбивает с толку. –

+0

Я добавил scrrenschot –

+0

у вас просто есть ссылки в обоих направлениях, нет петли. :) –

ответ

0

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

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

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

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

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

Вы видите?

+0

Если вы говорите, что сначала имеет свою собственную область, то почему у второго нет собственной сферы ,,, ??? он имеет только первый и список области? –

+0

Да, это означает, что хром-отладчик показывает только переменные в области, которые используются в этой области. См. Текст кода в 3-й строке вашего снимка экрана. –

2

A 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. и так ONNN ... Может быть, вы понимаете, что здесь происходит.

+0

Но я не вижу никакой функции построения списка в моем закрытии ?? –

+0

@ Parshuram, вы выполняете тот же код, что и вы, о котором вы писали? –

+0

Я сэр, но только это была переменная списка, а не я, которая не имеет никакого значения, см. Мой снимок экрана сейчас –