Всем привет! Сегодня я хочу представить тему, которую часто задают в интервью по Javascript: Closure!

Что такое закрытие в Javascript? Я бы сказал, что функция возвращает другую функцию, а возвращающая функция содержит лексическое окружение, в котором она была объявлена. Другими словами, функция возвращает другую функцию, а возвращающая функция сохраняет свою верхнюю функциональную среду. А теперь давайте посмотрим на пример.

const counter = function () {
    let n = 0;
    return function () {
        return ++n 
    }
}
const count=counter()//Call couter
//count qeuals the returning function from counter

console.log(count())//1
console.log(count())//2
console.log(count())//3
console.log(count())//4

В приведенном выше примере мы видим, что если мы вызовем счетчик функции, он вернет другую функцию. Кроме того, возвращающая функция вернет ++ n. Мы объявляем, что значение count равно функции, возвращаемой после вызова counter. Следовательно, count - это функция, мы можем ее вызвать. Как и в приведенном выше примере, мы можем вызвать count () четыре раза, и каждое значение, возвращаемое вызовом, на 1 больше, чем значение, возвращенное предыдущим вызовом.

Почему каждое возвращаемое значение отличается? Поговорим о коде. В счетчике функций мы объявляем вызов значения n, а начальное значение n равно 0. Возвращаемой функцией является return ++ n, что означает, что эта функция будет ссылаться на n в среде counter. Следовательно, count равно функции, возвращаемой из счетчика, означает, что count будет ссылаться на среду внутри счетчика. Теперь мы можем видеть, что каждый раз, когда вызывается счет, это означает вызов функции возврата из счетчика, а возвращающая функция будет ссылаться на n из counter и добавьте 1 к n, затем верните n.

Следовать за

После примера, я думаю, мы уже поняли, что такое закрытие. Теперь мы можем подумать о памяти. Как мы уже говорили ранее, count ссылается на среду внутри счетчика. Пока count ссылается на среду counter, пространство среды counter всегда будет в памяти. Следовательно, для экономии памяти, если мы обнаружим какое-либо закрытие, которое больше не будет использоваться, мы можем отказаться от него.

Чтобы отказаться от замыкания, нам просто нужно сделать значение, ссылающееся на лексическое окружение, нулевым. Например, в приведенном выше примере, если нам не нужно использовать count, мы просто используем count = null. В Javascript есть сборка мусора, после count = null среда из счетчика не имеет ссылки на какое-либо значение. В будущем экологическое пространство будет расчищено. Код выглядит следующим образом:

const counter = function () {
    let n = 0;
    return function () {
        return ++n 
    }
}const 
count=counter()//Call couter
//count qeuals the returning function from counter
console.log(count())//1
console.log(count())//2
console.log(count())//3
console.log(count())//4
count=null//discard the closure

Заключение

Закрытие - очень важная концепция в Javascript. Это широко используется в различных сценариях, например, синглтон, частные переменные, привилегированный метод и т. Д. Поэтому, если мы используем Javascript для разработки, мы должны быть знакомы с использованием закрытия.