Закрытие не означает, что оно обязательно возвращается функцией.В JavaScript каждая функция на самом деле является закрытием.Закрытие, как правило, является функцией, которая имеет доступ к области действия контекста объявления .
function outer(lastName)
{
const name = 'Bob';
function inner(lastName)
{
// here we have access to the outer function's scope
// thus it IS a closure regardless whether we return the function or not
console.log(name + ' ' + lastName);
}
inner(lastName);
}
outer('Marley');
Чтобы быть более конкретным: закрытие - это на самом деле концепция привязки текущей области к подконтексту.Мы часто коротко говорим «замыкание» функции, которая получает такой сопоставленный контекст.Контекст объявления не означает время объявления, тем более контекст объявления в его активном состоянии во время вызова.Это поведение используется для привязки контекста к внутренней функции и возврата функции со связанным контекстом:
function outer(lastName)
{
// this is the declaration context of inner().
const name = 'Bob';
function inner()
{
// here we have access to the outer function's scope at its CALL time (of outer)
// this includes the constand as well as the argument
console.log(name + ' ' + lastName);
}
return inner;
}
var inner1 = outer('Marley');
var inner2 = outer('Miller');
function output()
{
// this is the caller context, the const name ist NOT used
const name = 'Antony';
inner1(); // outputs 'Bob Marley'
inner2(); // outputs 'Bob Miller'
}
// test the output
output();