«Замыкание» — важное понятие в JS. Это не навык высокого уровня, а побочный эффект JS.

Беглый взгляд

Давайте быстро взглянем на Closure.

!function(){
  var counter= 5

  window.add= function(){
    counter += 1
  }

  window.minus = function(){
    counter -= 1
  }
}()

Внутри IIFE ( (Immediately Invoked Function Expression) есть локальная переменная counter и 2 функции. Вне IIFE мы можем использовать эти 2 функции для управления и доступа к значению counter .

window.add()
window.minus()

Это замыкание, которое использует функцию для доступа к локальным переменным.

Зачем нам это нужно

В ES5 мы определяем локальную переменную внутри области блока с помощью IIFE. Тогда это не повлияет на другие части нашего кода. Но есть проблема: что, если некоторым блокам нужна эта локальная переменная?

Чтобы решить эту проблему, разработчики JS придумали идею: предоставить API (способ) для доступа к нему и управления им (так же, как метод получения или установки в Java). Затем у нас есть новое «слово» — Closure: функция (API, доступная этой области) манипулирует локальной переменной этой области.

Вот еще один пример:

function fn(){
  var name = "Jack"

  return function(newName){
    name = newName
  }
}
var setName = fn() // setName is the API
setName("Bob")

Если вы не предоставляете некоторые функции (API), вы не можете использовать локальные переменные.

Резюме

  1. Закрытие в основном предназначено для сокрытия переменной и косвенного доступа к ней.
  2. Это просто концепция. Вы можете использовать его каждый раз, не зная этого имени, поэтому вам не нужно его знать.