English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основы JavaScript

Объекты JavaScript

Функции JavaScript

JS HTML DOM

JS браузер BOM

Основы AJAX

JavaScript справочник

Клозуры JavaScript

Переменные JavaScript могут принадлежатьЛокальнаяОбласть видимости илиГлобальнаяОбласть видимости.

Можно использоватьКлوزурУстановить глобальную переменную в локальную (частную).

Почему нам нужны closures?

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

Мы можем использовать глобальную переменную и функцию для увеличения счетчика:

// Инициализация счетчика
var counter = 0;
// Функция для увеличения счетчика
function increment() {
  counter++;
}
// Вызов increment() 3 раза
increment();
increment();
increment();

document.getElementById("output").innerHTML = `Счетчик: ${counter};`,
Проверьте, посмотрите < / >

Указанное решение имеет одну проблему: любое код на странице может изменить счетчик, не вызывая increment().

Внутренние функции JavaScript могут решить эту проблему.

Вложенные функции JavaScript

JavaScript поддерживает вложенные функции. Вложенные функции могут доступ к диапазону上方.

В этом примере внутренняя функция может доступ к переменной счетчика внешней функции:

function outer() {
  var counter = 0;
  function inner() {
      counter++;
  }
  return counter; 
}
Проверьте, посмотрите < / >

Накладные функции могут решить предыдущую проблему, если мы можем доступ к функции inner() извне.

Нам нужно найти способ, чтобы counter = 0 выполнялся только один раз, и это именно то, о чем пойдет речь в следующем разделе - клозура.

Клозуры JavaScript

Клозуры - это комбинация функции и лексической среды, в которой она была определена.

Клозуры могут доступ к переменным из области另一个 функции. Это достигается созданием функции внутри функции. Конечно, внешняя функция не может доступ к внутреннему области.

var increment = (function() {
  var counter = 0;
  function inner() {
      return ++counter;
  }
  return inner;
})();
Проверьте, посмотрите < / >

Значение, возвращаемое функцией self-исполнения, используется для инкрементации переменной.

Функция self-исполнения выполняется только один раз. Она устанавливает счетчик в ноль и возвращает функциональное выражение.

Клозуры могут доступ к области父 функции, даже если она уже закрыта.