Рекурсивное закрытие в 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
это особый вид объекта, который объединяет две вещи: функцию и среду, в которой эта функция была создана.
Не надо путать, поведение такое же, как и ожидалось в этом коде. Вот что происходит, когда вы делаете
console.dir( a );
в вашем коде он возвращаетSecond
функции, я думаю, это понятно для вас.Теперь, когда вы расширите эту функцию, она покажет вам в
Closure
родительская функция (environment function
) изSecond
, которыйbuildList
, В вашем коде это делает то же самое.Теперь следующая вещь, чтобы расширить это
function
buildList
То, что он покажет вам, это дочерние объекты, которыеvar i = 0;
иfunction first
, Ваша консоль показывает, как ожидалось.Теперь снова, когда вы открываете
first()
это покажет вам вClosure
родительская функция (environment function
) изfirst
, которыйbuildList
, (то же самое, что и в шаге 2).
Теперь он повторяет шаг 3 снова, а затем шаг 4. И так далее... Может быть, вы понимаете, что здесь происходит.
Инструменты разработчика отображают переменную a, которая является переменной, указывающей на анонимную функцию / замыкание.
В javascript функция определена в области видимости, а также она может определять область видимости по своему блоку тела. Область действия "знает" все переменные внутри определяющего блока и все переменные, которые определены за пределами функции, но в иерархии областей действия, в которой определена область.
Инструменты показывают вам объем возвращаемой функции (a
в этом случае). Функция first
определяется в объеме функции a
,
Переменная first
также известен в области анонимной функции, которую вы присвоили переменной first
,
И то, что вы получаете на экране: first
переменная, содержащая функцию В рамках этой функции переменная first
Известно, что указывает на функцию. В рамках этой функции...
Ты видишь?